繁体   English   中英

在装配体应用程序中修改内存

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM