我正在从“x86大会的艺术”一书中学习汇编语言,我有一个问题,我无法找到答案。
程序是这样的:
“在本练习中,您将启动一个程序运行程序,检查并操作内存中的值。然后您将切换到内存屏幕并修改内存中的值(也就是说,您将在程序继续执行时直接访问内存运行)。
程序首先将内存位置1000h设置为零,然后循环直到满足两个条件之一 - 用户切换FFF0开关或用户更改内存位置1000h中的值。切换FFF0开关会终止程序。
更改内存位置1000h中的值会将控制权转移到程序中将n个单词加在一起的部分,其中n是内存位置1000h中的新值。“
在总结这些值之后,它使用“put”
打印它们的总和我有这段代码:
d: mov cx,0
mov [1000],cx
a: mov cx,[1000]
cmp cx,0
jne c
mov ax,[fff0]
cmp ax,0
je a
halt
c: mov bx,1002
mov ax,0
b: add ax,[bx]
add bx,2
sub cx,1
cmp cx,0
jne b
put
jmp d
问题是当我将值12h置于1000h时,程序输出2个值,总和和数字1。
当我单步执行程序时,它会输出1个值(总和),但是当我运行它时,它会输出2个值(总和和数字1)。
有人可以解释一下这种行为吗?
答案 0 :(得分:0)
我解释了代码,希望它可以帮助某人:
注意:此代码不考虑更改寄存器的多线程或中断。这是一个直接的自上而下的分析(帮助初学者,而不是'专家')。
d: mov cx,0 ; cx = 0
mov [1000],cx ; Memory address 1000=0
a: mov cx,[1000] ; Get from memory address 1000 to cx (cx=0)
cmp cx,0 ; Is cx = 0?
jne c ; If cx not 0 goto c
mov ax,[fff0] ; ax = {whatever is at FFF0}
cmp ax,0 ; Is ax=0?
je a ; If ax = 0 goto a
halt ; {STOP PROCESSOR}
c: mov bx,1002 ; BX = 1002
mov ax,0 ; AX = 0
b: add ax,[bx] ; Add to ax WHATEVER is in MEMORY location bx
add bx,2 ; Add 2 to bx
sub cx,1 ; Deduct 1 from cx
cmp cx,0 ; is cx = 0?
jne b ; If cx is not 0 goto b
put {what do you want to print?}
jmp d ; goto d (back to the top)