1

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

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

4

1 回答 1

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)
于 2018-03-21T18:00:33.920 回答