【发布时间】:2013-07-08 10:54:38
【问题描述】:
我正在尝试在程序集 8086 上构建一个针对计算机的井字游戏,但每当我运行它时,TD 都会卡在这个特定的命令上:
mov dx, 0
此命令在函数中(第三行):
reboard proc
mov al, 0
mov bx, 0
mov dx, 0
mov cx, bp
rowdata:
cmp arr[bx], 'X'
je rowX
cmp arr[bx], 'y'
je rowY
jmp rowQm
rowX:
add al, 100
jmp rowQm
rowY:
add al, 1
rowQm:
inc bx
loop rowdata
mov cx, bp
add si, dx
mov arr[si + 3], al
sub si, dx
mov al, 0
inc dx
cmp dx, bp
jnz rowdata
mov dx, 0
mov bx, dx
coldata:
cmp arr[bx], 'X'
je colX
cmp arr[bx], 'Y'
je colY
jmp colQm
colX:
add al, 100
jmp colQm
colY:
add al, 1
colQm:
add bx, bp
loop coldata
add si, bp
add si, dx
mov arr[si + 3], al
sub si , dx
sub si, bp
inc dx
mov bx, dx
mov al, 0
mov cx, bp
dec cx
cmp dx, bp
jnz coldata
ret
reboard endp
此外,函数中的前两个命令被应用,但不对寄存器做任何改变。
这不是我第一次遇到这个问题,它也发生在另一个函数中(在同一个程序中),同样 - 函数中的前两个命令不起作用。命令是:
mov dl, 13
我试图将光标向下移动一行。
我也在一个新程序上运行了这个特定的功能,它从头到尾都运行良好,我一无所知,反正这是我尝试的新程序:
注意:'X'的值为88,'Y'的值为89。
dseg segment
arr db 63, 63, 89, 88, 89, 63, 63, 88, 89
dseg ends
cseg segment
assume cs:cseg, ds:dseg
a proc
mov al, 0
mov bx, 0
mov dx, 0
mov cx, bp
rowdata:
cmp arr[bx], 'X'
je rowX
cmp arr[bx], 'Y'
je rowY
jmp rowQm
rowX:
add al, 100
jmp rowQm
rowY:
add al, 1
rowQm:
inc bx
loop rowdata
mov cx, bp
add si, dx
mov arr[si + 3], al
sub si, dx
mov al, 0
inc dx
cmp dx, bp
jnz rowdata
mov dx, 0
mov bx, dx
coldata:
cmp arr[bx], 'X'
je colX
cmp arr[bx], 'Y'
je colY
jmp colQm
colX:
add al, 100
jmp colQm
colY:
add al, 1
colQm:
add bx, bp
loop coldata
add si, bp
add si, dx
mov arr[si + 3], al
sub si , dx
sub si, bp
inc dx
mov bx, dx
mov al, 0
mov cx, bp
cmp dx, bp
jnz coldata
ret
a endp
Begin:
mov ax, dseg
mov ds, ax
mov bp, 3
mov si, 9
call a
int 3h
cseg ends
end begin
有什么想法吗?
【问题讨论】:
-
可能 inc dx 溢出并设置了一个标志,因此 cmp dx, bp 总是跳转导致 mov dx,0 无法访问。
-
“卡住”到底是什么意思?
-
会不会是你在写代码段?我真的不知道您所说的“卡住”是什么意思,所以我只是在猜测。不过,如果你不是在源代码中调试,而是在内存中调试,你应该看看指令是否发生了变化。
-
一目了然,有些事情似乎不对劲。为什么基指针寄存器
bp用作计数器?bp通常是指向堆栈的地址。此外,当您执行mov si,dx或add si,dx时,dx似乎始终为零,因为它在您的示例中的第 4 行设置为零,并且在两者之间没有更改。 -
在较旧的纯汇编中,只有寄存器传递约定,我曾经看到 bp 有时用作通用寄存器。通常这样做很危险,但它可以在某些情况下起作用。