[英]Modifying Memory In An Assembly Application
我正在学习《 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)。
有人可以解释这种行为吗?
我解释了代码,希望它对某人有帮助:
注意:此代码不考虑多线程或中断更改寄存器。 这是一种直接的自上而下的分析(帮助初学者,而不是“专家”)。
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)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.