我已经从我的学院创建了一个程序集8086 程序,只是打印出结果是或否, TASM 汇编程序显示错误的答案,当我检查调试器以查看它是如何发生的时候,它实际上正在做正确的事情!你说的问题是什么? 代码如下:
.model small
.stack 100h
.data
a dw 1101001001001011b
b db 'yes$'
d db 'no$'
.code
mov ax, @data
mov ds, ax
mov dx,0
mov cl ,1
loop1:
mov ah,0
mov al,0
rol a,cl
adc ah,0
rcr a,cl
rcr a,cl
adc al,0
rol a,cl
cmp ah,al
jne outloop
inc cl
inc di
cmp di,7
jne loop1
mov dx ,offset b
mov ah,9
int 21h
jmp outt
outloop:
mov dx ,offset d
mov ah,9
int 21h
jmp outt
outt:
.exit
end
在这段代码中我需要实际检查数字(在数据段上名称 a )是否对称,并打印出答案。在这种情况下答案应该是肯定的,但它打印出来没有..
答案 0 :(得分:0)
迈克尔说了什么,加上一些想法,如果你将来遇到类似的问题怎么办:
当调试器失败时,您可以通过记录,哔哔声,断言等来感染您的代码......
所以例如:你是否会在屏幕上每个周期输出“* \ n”,你很快就会发现它在7个周期后没有结束,但做得更多。
然后,您可以专注于验证有关可能的循环退出的所有假设,例如在ax
(cmp ah,al
之前)和di
(cmp di,7
之前)打印值
这是一种绝望的措施,但有时会有所帮助(为了节省时间)。
有时候重新开始甚至更快,并从头开始编写特定功能。使用本地git
存储库,并经常提交,只要您完成一些小任务,然后在调试和工作时,您可以轻松返回到某个工作版本,并再次开始修改。或者至少可以轻松地比较一下你对旧的工作代码所做的改变。
或者为了避免错误的假设,故意将0xDEADBEEF
之类的值放入应用程序开头的所有寄存器中,在堆栈/内存缓冲区或分配内存之后,或者在释放之前,等等(make)调试构建的代码可选,仅由一些define-macro构建。 C ++调试版本经常使用各种CCCC...
/ DDDD...
/ FDFD..
/ ...内存标记来填充未初始化/释放的内存,因此代码在执行某些操作时会遇到“奇怪”的值不正确。