大会8086作业 - 填补空白,误会

时间:2015-01-08 20:48:53

标签: assembly stack x86-16

首先我要道歉,英语不是我的母语,我无法想出一个更符合我情况的头衔。

我得到了这个不完整的汇编代码:

.code
    mov [mybyte],______
    mov SP,0574h
    xor ax,ax
here:
    add AL,[mybyte]
    push AX
    dec BYTE PTR [mybyte]
    jnz here
    pop es
    nop

问题是:_____应该写什么,这样当我们达到“nop”命令时,SP的值将是570.

我理解这个问题,我认为我也理解代码,但问题是,我看到它的方式 - SP永远不会改变。代码中引用SP的唯一位置是mov sp,0574h行。所以无论我们在____所在的位置写什么,SP都不会改变。

我说错了吗?或者我误解了代码?

2 个答案:

答案 0 :(得分:5)

push更改SP,即按2递减。 pop也会更改它,它会相反,它会添加2。这是假设16位模式。

由于最终pop添加2,您需要循环3次才能从570h获得574h。因此,正确的值为3

push AX ; SP = 572h
...
push AX ; SP = 570h
...
push AX ; SP = 56Eh
...
pop es  ; SP = 570h

答案 1 :(得分:0)

Sry基因。不能使用评论。回答你的第二个问题: ES 0006是正确的。 mybyte从3减少到0也是对的。目前唯一错误的是将值推到堆栈中。再次检查每个循环周期AL会发生什么。

扰流:

如果您想了解自己,请不要阅读:

Mybyte未移入AL但已添加到其中: 0 + 3 + 2 + 1 = 6