-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 但它总是会停止。我在我的操作系统中试过这个。谢谢。

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 调用约定

我建议使用cdecl并在每个子例程的顶部添加“C 函数签名注释”:

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

    ; ...

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