修改程序集应用程序中的内存

时间:2008-11-19 08:41:07

标签: assembly x86-16

我正在从“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)。

有人可以解释一下这种行为吗?

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)