-1

私のアプリは動作していませんでした。保存オプションを選択すると停止しました。バグはどこですか?

    [bits 16]
    [org 0x7d00]

    ;Start
start:
    mov ah,00
    mov al,03h
    int 10h
    mov ax,0a00h
    mov es,ax
keys:
    mov ax,10h
    int 16h
    cmp al,'1'
    je new
    cmp al,'2'
    je load
    jmp keys
new:
    mov cx,1
    mov dx,1
    int 10h
    mov ax,0013h
    int 10h
.key:
    pusha ;save regs
    mov ax,10h
    int 16h
    cmp al,' '
    je .draw_pix
    cmp al,'w'
    je .up
    cmp al,'s'
    je .down
    cmp al,'a'
    je .left
    cmp al,'d'
    je .right
    cmp al,'q'
    je start
    cmp al,'e'
    je save
    cmp al,'c'
    je clear
    cmp al,'r'
    je load
    cmp al,'p'
    je save
    jmp .key
    ;---------------------
.draw_pix :
    popa
    mov ah,0x0C
    int 10h
    jmp .key
    ;---------------------
.up:
    popa
    dec dx
    jmp .key
    ;---------------------
.down:
    popa
    inc dx
    jmp .key
    ;---------------------
.left:
    popa
    dec cx
    jmp .key
    ;---------------------
.right:
    popa
    inc cx
    jmp .key
    ;---------------------
.inccolor:
    popa
    inc al
    jmp .key
    ;---------------------
.deccolor:
    popa
    dec al
    jmp .key
    ;---------------------
load:
    ;....

clear:
    mov ax,0013h
    int 10h
    jmp keys
save:
    mov cx,0
    mov dx,0
.read:
    add [Buffer],cx
    add [Buffer],dx
    add [Buffer],al
    mov ah,0x0D
    int 10h
.getx:
    cmp cx,319
    je .gety
    inc cx
    jmp .read
.gety:
    cmp dx,199
    je start
    inc dx
    mov cx,0
    jmp .read

exit:
    ret

Buffer times 512 dw 0

なぜこれが停止していたのか理解できませんか?保存機能。ピクセルを読み取り、バッファ: X、Y、Color を書き込む必要がありますが、常に停止します。os.Thanksでこれを試しました。

4

1 に答える 1

2

サブルーチンを使用する適切な方法は (例のみ):

mySubroutine:
    push bp
    mov bp,sp

    mov ax,[ss:bp + 4]    ; load first parameter into AX
    mov bx,[ss:bp + 6]    ; load second parameter into BX

    ; do work here

    mov sp,bp
    pop bp
ret

; ...

; push parameters from right to left, invoke mySubroutine
; and clean up stack afterwards
mov ax,9
push ax    ; push the second parameter onto the stack
mov ax,7
push ax    ; push the first parameter onto the stack
call mySubroutine
add sp,4

追加されたコメントは「初心者向けのヒント」のためだけにあることに注意してください。ライブのプロフェッショナル コードでは完全に不必要であるか、邪魔になることさえあります。

詳細については、「x86 呼び出し規約」を参照してください。

各サブルーチンの先頭に「C 関数シグネチャ コメント」を追加するとともにcdeclをお勧めします。

; void print(char* text)
_print:
    push bp
    mov bp,sp

    ; ...

    mov sp,bp
    pop bp
ret
于 2013-07-25T08:29:26.997 に答える