我的应用程序无法运行它在保存选项选择时停止。错误在哪里?
[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中试过这个。
答案 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