【问题标题】:Assembly 8086 homework - fill in the blank, misunderstanding组装8086作业——填空题,误区
【发布时间】:2015-03-07 02:31:51
【问题描述】:

首先我要道歉,英语不是我的母语,我想不出一个更适合我情况的标题。

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

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

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

【问题讨论】:

  • SP 是堆栈指针,因此它在push AX 处递减(堆栈在内存中向下增长)。
  • 啊,push/pop命令改变SP?好吧,这更有意义。谢谢你。如果你把它写成答案,我会接受它。
  • 您可以继续接受 Jester 的回答,它更彻底地涵盖了相同的领域。

标签: assembly stack x86-16


【解决方案1】:

对不起。还不能使用评论。回答你的第二个问题: ES 0006 是正确的。 mybyte 从 3 减少到 0 也是正确的。目前你唯一错的是什么值被压入堆栈。只需再次检查每个循环周期 AL 会发生什么。

剧透:

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

Mybyte 没有移入 AL 而是添加到其中: 0 + 3 + 2 + 1 = 6

【讨论】:

    【解决方案2】:

    push改变SP,即减少2pop 也改变了它,它做了相反的事情,它添加了2。这是假设 16 位模式。

    由于最后的pop后面加了2,所以需要循环3次才能从574h得到570h。因此正确的值为3

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

    【讨论】:

    • 我希望你不会告诉我正确的值是 3,但经过明确的解释后,我确信我会自己得到它。竖起大拇指!
    • 我还有一个问题,如果可以的话。我运行了我放“3”而不是行的代码,答案是正确的,SP 是 570,但 ES 不是我期望的那样。第一次推送时,我们推送 0003h。然后我们推 0002h,然后我们推 0001h,然后我们弹出。所以我预计 ES 是 0001h。但相反,我看到 ES 是 0006h。这是为什么呢?
    • 您错过了add AL。被推送的不是字节,而是总和。所以3+2+1=6.
    猜你喜欢
    • 1970-01-01
    • 2023-03-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-04-15
    • 1970-01-01
    相关资源
    最近更新 更多