2016-06-19 55 views
0

我有一個項目要在學校的asembley中完成,我需要將我在char表(我打開的圖片)中繪製的像素複製到同一張圖片中的另一張圖片瀏覽器(我的代碼在開始時打開圖片創建新的圖片是相同的,然後我需要後,我在單詞表中圖片圈一個單詞複製被繪的像素到複製圖片) 有人知道如何做到這一點? 這是我打開圖片的代碼,並且讓玩家1在作爲遊戲地圖的表格照片中圈出單詞,並且如果單詞法律和玩家2接受單詞,則轉到玩家2,並且如果否我想要的代碼到遊戲地圖複製到其他圖片我已經保存和創造從1張照片複製光標像素繪畫到另一個組裝

IDEAL 
MODEL small 
STACK 100h 
DATASEG 
color db 2 
color2 db 14 
message db 'IS The Word Legal?$' 
filename db 'open.bmp',0 
filehandle dw ? 
Header db 54 dup (0) 
Palette db 256*4 dup (0) 
ScrLine db 320 dup (0) 
ErrorMsg db 'Error', 13, 10,'$' 
cxval dw ? 
dxval dw ? 
colorval db ? 
filename2 db 'yoav.bmp',0 ;The new file 
filehandle2 dw ? 
CODESEG 
proc OpenFile 
    ; Open file 
    mov ah, 3Dh 
    xor al, al 
    mov dx, offset filename 
    int 21h 
    jc openerror 
    mov [filehandle], ax 
    ret 
openerror: 
    mov dx, offset ErrorMsg 
    mov ah, 9h 
    int 21h 
    ret 
endp OpenFile 
proc ReadHeader 
    ; Read BMP file header, 54 bytes 
    mov ah,3fh 
    mov bx, [filehandle] 
    mov cx,54 
    mov dx,offset Header 
    int 21h 
    ret 
endp ReadHeader 
proc ReadPalette 
; Read BMP file color palette, 256 colors * 4 bytes (400h) 
    mov ah,3fh 
    mov cx,400h 
    mov dx,offset Palette 
    int 21h 
    ret 
endp ReadPalette 
proc CopyPal 
; Copy the colors palette to the video memory 
; The number of the first color should be sent to port 3C8h 
; The palette is sent to port 3C9h 
    mov si,offset Palette 
    mov cx,256 
    mov dx,3C8h 
    mov al,0 
    ; Copy starting color to port 3C8h 
    out dx,al 
    ; Copy palette itself to port 3C9h 
    inc dx 
PalLoop: 
    ; Note: Colors in a BMP file are saved as BGR values rather than RGB. 
    mov al,[si+2] ; Get red value. 
    shr al,2 ; Max. is 255, but video palette maximal 
    ; value is 63. Therefore dividing by 4. 
    out dx,al ; Send it. 
    mov al,[si+1] ; Get green value. 
    shr al,2 
    out dx,al ; Send it. 
    mov al,[si] ; Get blue value. 
    shr al,2 
    out dx,al ; Send it. 
    add si,4 ; Point to next color. 
    ; (There is a null chr. after every color.) 
    loop PalLoop 
    ret 
endp CopyPal 
proc OpenOutputFile 
; Open the output file 
    mov ah, 3Dh 
    mov al, 2h 
    mov dx, offset filename2 
    int 21h 
    jc openerror3 
    mov [filehandle2], ax 
    ret 
openerror3: 
    mov dx, offset ErrorMsg 
    mov ah, 9h 
    int 21h 
    jmp exit 
    ret 
endp OpenOutputFile 

proc CreateAndOpenOutputFile 
; Create file 
    mov ah, 3Ch 
    mov cx, 0 
    mov dx, offset filename2 
    int 21h 
    jc openerror2 
    call OpenOutputFile 
    ret 
openerror2: 
    mov dx, offset ErrorMsg 
    mov ah, 9h 
    int 21h 
    jmp exit 
    ret 
endp CreateAndOpenOutputFile 
proc WriteOutputFileHeader 
; Write BMP file header, 54 bytes into the output file 
    mov ah,40h 
    mov bx, [filehandle2] 
    mov cx, 54 
    mov dx,offset Header 
    int 21h 
    ret 
endp WriteOutputFileHeader 
proc WriteOutputFilePalette 
; Write BMP file color palette, 256 colors * 4 bytes (400h) into the output file 
    mov ah,40h 
    mov bx, [filehandle2] 
    mov cx, 400h 
    mov dx,offset Palette 
    int 21h 
    ret 
endp WriteOutputFilePalette 
proc CopyInputFileBitmap 
; BMP graphics are saved upside-down. 
; Read the graphic line by line (200 lines in VGA format), 
; displaying the lines from bottom to top. 
    mov ax, 0A000h 
    mov es, ax 
    mov cx,200 
PrintBMPLoop: 
    push cx 
    ; di = cx*320, point to the correct screen line 
    mov di,cx 

    shl cx,6 
    shl di,8 
    add di,cx 

    ; Read one line 
    mov ah,3fh 
    mov bx, [filehandle] 
    mov cx,320 
    mov dx,offset ScrLine 
    int 21h 
    Change: 
    ;copy the data into the output file 
    mov ah, 40h 
    mov bx, [filehandle2] 
    mov cx, 320 
    mov dx, offset ScrLine 
    int 21h 
loadImage: 
    ; Copy one line into video memory 
    cld ; Clear direction flag, for movsb 
    mov cx,320 
    mov si,offset ScrLine 
    rep movsb ; Copy line to the screen 
       ;rep movsb is same as the following code: 
       ;mov es:di, ds:si 
       ;inc si 
       ;inc di 
       ;dec cx 
       ;loop until cx=0 
    pop cx 
    loop PrintBMPLoop 
    ret 
endp CopyInputFileBitmap 
proc CloseInputFile 
; Close the input file 
    mov ah,3Eh 
    mov bx, [filehandle] 
    int 21h 
    ret 
endp CloseInputFile 

proc CloseOutputFile 
; Close the output file 
    mov ah,3Eh 
    mov bx, [filehandle2] 
    int 21h 
    ret 
endp CloseOutputFile 

start: 
    mov ax, @data 
    mov ds, ax 
    ; Graphic mode 
    mov ax, 13h 
    int 10h 
    ; Process BMP file 
    call OpenFile 
    call ReadHeader 
    call ReadPalette 
    call CopyPal 
    call CreateAndOpenOutputFile 
    call WriteOutputFileHeader 
    call WriteOutputFilePalette 
    call CopyInputFileBitmap 
    call CloseInputFile 
    call CloseOutputFile 
    jmp Mouse 
MessagePrint2: 
    mov dx, offset message 
    mov ah, 9 
    int 21h 
    mov dl,10 
    mov ah, 2 
    int 21h 
    mov ah, 1 
    int 21h 
    xor cx, cx 
    mov cl, 79h 
    cmp cl,al 
    je MouseLp 
    mov cl, 6Eh 
    cmp cl, al 
    je NextTurn 
Mouse: 
    mov ax, 0h 
    int 33h 
    mov ax, 1h 
    int 33h 
MouseLp: 
    mov ax, 3h 
    int 33h 
    cmp bx, 01h 
    jne MouseLp 
Draw: 
    shr cx, 1 
    sub dx, 1 
    mov bh, 0h 
    mov al,[color] 
    mov ah, 0Ch 
    int 10h 
    mov ax, 3h 
    int 33h 
    cmp bx, 01h 
    je Draw 
    jmp MessagePrint 
MessagePrint: 
    mov dx, offset message 
    mov ah, 9 
    int 21h 
    mov dl,10 
    mov ah, 2 
    int 21h 
    mov ah, 1 
    int 21h 
    xor cx, cx 
    mov cl, 79h 
    cmp cl,al 
    je NextTurn 
    mov cl, 6Eh 
    cmp cl, al 
    jne go 
go: 
    jmp MouseLp 
NextTurn: 
    mov ax, 0h 
    int 33h 
    mov ax, 1h 
    int 33h 
MouseLpA: 
    mov ax, 3h 
    int 33h 
    cmp bx, 01h 
    jne MouseLpA 
DrawA: 
    shr cx, 1 
    sub dx, 1 
    mov bh, 0h 
    mov al,[color2] 
    mov ah, 0Ch 
    int 10h 
    mov ax, 3h 
    int 33h 
    cmp bx, 01h 
    je DrawA 
    jmp MessagePrint2 
exit: 
    mov ax, 4c00h 
    int 21h 
END start 
+1

我想你應該讀[this](http://stackoverflow.com/help/how-to-ask)並重新修改你的問題。 – Wilt

回答

1

你的問題不清楚(最好再句話吧),但看你的代碼揭示了這些問題:

proc CreateAndOpenOutputFile 
    ; Create file 
    mov ah, 3Ch 
    mov cx, 0 
    mov dx, offset filename2 
    int 21h 
    jc openerror2 
    call OpenOutputFile 
    ret 

當一個文件被創建時它也是開放的意義你得到一個處理。您的代碼中不需要有call OpenOutputFile。 DOS以正常的讀寫權限自動打開文件。雖然保存手柄:mov [filehandle2], ax


mov cx,200 
PrintBMPLoop: 
    push cx 
    ; di = cx*320, point to the correct screen line 
    mov di,cx 
    shl cx,6 
    shl di,8 
    add di,cx 

這將在PrintBMPLoop的第一次迭代點下面的320x200的屏幕!在使用之前,您需要從DI減去320。在計算的開始或者使用dec cx

push cx 
    dec cx 
    mov di, cx 
    shl cx, 6 
    shl di, 8 
    add di, cx 

我沒有深入到你的程序的交互部分,因爲問題並不暗示什麼問題。

相關問題