汇编语言中 加法(ADD)与带进位加法(ADC)有什么区别?

汇编语言中 加法(ADD)与带进位加法(ADC)有什么区别?,第1张

加法(ADD)和带进位加法(ADC)最大的区别就是,ADC除了完成ADD加法指令运算,还必须和加进位标志位相加,才能得到最终计算结果。

加法(ADD)功能是实现两个 *** 作数相加,其结果送至目的 *** 作数,源 *** 作数不变。两个 *** 作数不能同时为存储器寻址方式。

带进位加法(ADC)指令主要用于与ADD指令相结合实现多字节数相加。对 *** 作数的要求也与add指令一样。运算结果对PSW(程序状态字)有影响。

共有四种寻址方式:立即寻址、直接寻址、寄存器寻址和寄存器间接寻址。

扩展资料

逻辑运算指令:

这部分指令用于执行算术和逻辑运算,包括加法指令ADD/ADC、减法指令SUB/SBB、加一指令INC、减一指令DEC;

比较 *** 作指令CMP、乘法指令MUL/IMUL、除法指令DIV/IDIV

符号扩展指令CBW/CWDE/CDQE、十进制调整指令DAA/DAS/AAA/AAS、逻辑运算NOT/AND/OR/XOR/TEST等。

参考资料来源:百度百科--加法指令

加法运算主要包含ADD、ADC和INC三条指令,除INC不影响进位标志CF外,其他指令按照定义影响全部状态标志位, 即按照运算结果相应设置各个状态标志为0或1。

1. 加法指令ADD

加法指令 ADD 使目的 *** 作数加上源 *** 作数,和的结果送到目的 *** 作数。

格式如下:

ADD reg,imm/reg/mem;加法:reg-reg+imm/reg/mem

ADD mem,imm/reg:加法:memmem+imm/reg

它支持寄存器与立即数、 寄存器、 存储单元, 以及存储单元与立即数、 寄存器间的加法运算, 按照定义影响6个状态标志位。 例如:

mov eax,Oaaff7348h;EAX=AAFF7348H,不影响标志

add al,27h;AL=AL+27H=48H+27H=6FH,所以EAX=AAFF736FH

:状态标志:OF=0,SF=0,ZF= 0,PF=1,CF=0

add ax,3fffh;AX=AX+3FFFH=736FH+3FFFH=B36EH,所以EAX=AAFFB36EH

状态标志:OF=1,SF=1,ZF=0,PF=0,CF=0

add eax,88000000;EAX=EAX +88000000H=AAFFB36EH+88000000H=[1]32FFB36EH

状态标志OF=1,SF=0,ZF=0,PF=0,CF=1

算术运算类指令既可以进行8位运算也可以进行16位和32位运算。 对于8位运算指令, 状态标志反映8位运算结果的状态同样, 进行16位或32位运算, 状态标志 (除PF) 也是反映16位或32位运算结果的状态。 例如, 进位 CF 标志在进行8 位加法时反映最高位 D, 的向上进位,而进行32位加法时则反映最高位D.,的进位。

2.带进位加法指令ADC

带进位加法指令ADC (Add with Carry) 除完成ADD加法运算外, 还要加上进位CF, 结果送到目的 *** 作数, 按照定义影响6个状态标志位。 格式如下:

ADC reg, imm/reg/mem带进位加法:reg=reg+imm/reg/mem+CF

ADC mem, imm/reg带进位加法:mem=mem+imm/reg+CF

ADC指令用于与ADD指令相结合实现高精度数的加法。IA-32处理器可以实现32位加法。但是, 多于32位的数据相加就需要先将两个 *** 作数的低32位相加 (用ADD指令), 然后再加高位部分, 并将进位加到高位 (需要用ADC指令)。

[例] 64位数据相加程序

数据段

qvar1 qword 6778300082347856h64位数据1

qvar2 qword 6776200082348998h:64位数据2

代码段

mov eax, dword ptr qvar1取低32位

add eax, dword ptr qvar加低32位,设置CF

mov edx,dword ptr qvarl +4取高32位

adc edx,dword ptr qvar2 +4加高32位,同时也加上CF

call disprd

本示例程序实现两个64位整数相加, 和值保存在EDX (高32位) 和EAX (低32位) 寄存器对中。 64位数据用4字变量定义QWORD, 先加低32位 (ADD指令), 再加高32位 (ADC指令) 进行高32位加法时, 需要加上低32位相加形成的进位标志CF, 所以使用了带进位的加法指令.MOV指令不影响任何状态标志, 所以执行 ADC指令时使用的 CF 就是前面 ADD指令设置的状态。 与32位寄存器配合, 具有64位属性的变量需要进行强制类型转换, 用 “DWORD PTRQVARI" 指向低32位, 用 "DWORD PTR QVARI+4” 指向高32位,

3. 增量指令INC

增量指令INC (Increment) 只有一个 *** 作数, 对 *** 作数加1(增量) 再将结果返回原处。

INC reg/mem加:reg/mem=reg/mem+1

设计增量指令的目的, 主要是对计数器和地址指针进行调整, 所以它不影响进位CF标志,但影响其他状态标志位。例如:

inc ecx:双字量数据加1:ECX=ECX+1

inc dword ptr[ebx] 双字量数据加1:[EBX]=[EBX]+1


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/7836252.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-10
下一篇 2023-04-10

发表评论

登录后才能评论

评论列表(0条)

保存