首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >asm中的ADC指令

asm中的ADC指令
EN

Stack Overflow用户
提问于 2017-06-14 08:57:55
回答 1查看 7.6K关注 0票数 6

在以下代码中,

代码语言:javascript
复制
MOV AL,NUMBER1
ADD AL,NUMBER2
MOV AH, 00H
ADC AH, 00H

第3行和第4行是做什么的?他们干些什么?

此外,为什么代码明确了AH?(我猜是因为AL的"ADD“操作可能会产生进位。)

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-06-14 09:08:52

为了解决这个问题,首先查找每条指令所做的事情:

  • MOV AH, 00H instruction将在不影响标志的情况下将AH寄存器设置为0。
  • ADC AH, 00H instruction将添加源操作数(0)、进位标志(CF)和目标操作数(AH),将结果存储在目标操作数(AH)中。 从象征意义上说,它是这样的:AH = AH + 0 + CF 请记住,MOV不影响标志,因此ADC指令使用的CF值是 instruction先前设置的值(在第2行)。 而且,此时AH是0,所以这实际上就是:AH = CF

现在你知道密码是干什么的了:

  1. 它将NUMBER1移动到AL寄存器:AL = NUMBER1
  2. 它将NUMBER2添加到AL寄存器:AL = NUMBER1 + NUMBER2
  3. 它清除AHAH = 0
  4. 它将AH设置为CF,这是通过添加NUMBER1NUMBER2设置的。因此,如果添加需要进位,则AH为1,否则为0。(AH = CF)

至于这段代码的目的,它显然是执行一个16位加法两个8位数字。在伪C中,它基本上是:

代码语言:javascript
复制
BYTE NUMBER1;
BYTE NUMBER2;
WORD RESULT = (WORD)NUMBER1 + (WORD)NUMBER2;

将字节大小的输入扩展到单词并将其相加在一起。为什么要这么做?好吧,处理溢出问题。如果将两个8位值相加,结果可能大于8位值。

要理解这一点,真正的诀窍可能是ALAH寄存器分别是AX寄存器的下位和上位。因此,在这些说明之后,您可能会看到AX正在被使用。这包含了添加NUMBER1NUMBER2的16位结果。

票数 11
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/44540078

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档