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
changesSP
,即它按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=6SP是堆栈指针,因此它在
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
。