【发布时间】:2013-07-25 07:41:50
【问题描述】:
我的应用程序在保存选项选择时暂停它停止。错误在哪里?
[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 但它总是会停止。我在我的操作系统中试过这个。谢谢。
【问题讨论】:
-
无意冒犯,但只要你的代码结构良好,问题要么不存在,要么很容易被发现。
save实际上做了很多事情,而不是你暗示的。它将 0 放入cx和dx,然后运行通过.read、.getx、.gety,然后最终重新启动整个程序 (je start) 或者只是卡在 @987654329 @->.getx->.gety“循环”。你想做什么? -
子程序不会跳转到,而是被调用。了解如何从 x86 调用子例程并修改您的代码。也评论一下,我不会读未注释的程序集。
-
我正在尝试像素绘画,但你认为它有效吗?
-
如果它的电话,也许。不会跳?
-
@m0skit0 我更喜欢编写良好的干净代码而不是 cmets。