为什么我的计划不能成功?

时间:2013-07-25 07:41:51

标签: assembly x86 nasm

我的应用程序无法运行它在保存选项选择时停止。错误在哪里?

    [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中试过这个。

1 个答案:

答案 0 :(得分: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 calling conventions

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

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

    ; ...

    mov sp,bp
    pop bp
ret