Assembly 汇编8086作业-填补空白,误解

Assembly 汇编8086作业-填补空白,误解,assembly,stack,x86-16,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,那么应该在_______;的位置写什

首先我想道歉,英语不是我的母语,我想不出一个更适合我的题目

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

.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都不会改变


我说得对吗?还是我误解了代码?

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

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

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

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

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

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

Sry。还不能用评论。回答你的第二个问题: ES 0006是正确的。mybyte从3减少到0,这也是正确的。目前您唯一的错误是将哪些值推送到堆栈中。只需再次检查所有循环周期的情况

扰流板:

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

Mybyte未移动到AL中,而是添加到AL中:
0+3+2+1=6。还不能用评论。回答你的第二个问题: ES 0006是正确的。mybyte从3减少到0,这也是正确的。目前您唯一的错误是将哪些值推送到堆栈中。只需再次检查所有循环周期的情况

扰流板:

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

Mybyte未移动到AL中,而是添加到AL中:
0+3+2+1=6

SP是堆栈指针,因此它在
push AX
时递减(堆栈在内存中向下增长)。啊,push/pop命令会改变SP吗?好吧,这就更有意义了。非常感谢。如果你把它写成一个答案,我会接受的。你可以继续接受Jester的答案,它涵盖了同样的内容。SP是堆栈指针,所以它在
push AX
时递减(堆栈在内存中向下增长)。啊,push/pop命令会改变SP吗?好吧,这就更有意义了。非常感谢。如果你把它写下来作为一个答案,我会接受的。你可以继续接受Jester的答案,它涵盖了同样的内容。我希望你不会告诉我正确的值是3,但在清楚的解释之后,我相信我会自己得到它。竖起大拇指!如果可以的话,我还有一个问题。我在代码中用“3”代替了行,答案是正确的,SP是570,但ES不是我所期望的。我们第一次推,我们推0003h。然后我们按0002h,然后按0001h,然后我们弹出。所以我希望ES是0001h。但是相反,我看到ES是0006h。为什么?您错过了添加AL的
。推送的不是字节,而是总和。所以
3+2+1=6
。我希望你不要告诉我正确的值是3,但是在清楚地解释之后,我相信我会自己得到的。竖起大拇指!如果可以的话,我还有一个问题。我在代码中用“3”代替了行,答案是正确的,SP是570,但ES不是我所期望的。我们第一次推,我们推0003h。然后我们按0002h,然后按0001h,然后我们弹出。所以我希望ES是0001h。但是相反,我看到ES是0006h。为什么?您错过了添加AL的
。推送的不是字节,而是总和。所以
3+2+1=6