ADC reg, reg
ADC mem, reg
ADC reg, mem
ADC mem, imm
ADC reg, imm
mov dl, 0
mov al, 0FFh
add al, 0FFh ; AL = FEh
adc dl, 0 ; DL/AL = OlFEh
mov edx, 0
mov eax, 0FFFFFFFFh
add eax, 0FFFFFFFFh
adc edx, 0
;------------------------------------------
Extended_Add PROC
; 计算两个以字节数组存放的扩展整数之和。
; 接收:ESI和EDI为两个加数的指针
; EBX 为和数变量指针,
; ECX为
; 相加的字节数。
; 和数存储区必须比输入的操作数多一个字节。
; 返回:无
;------------------------------------------
pushad
clc ;清除进位标志位
L1: mov al, [esi] ;取第一个数
adc al, [edi] ;与第二个数相加
pushfd ;保存进位标志位
mov [ebx], al ;保存部分和
add esi, 1 ;三个指针都加1
add edi, 1
add ebx, 1
popfd ;恢复进位标志位
loop L1 ;重复循环
mov byte ptr [ebx], 0 ;清除和数高字节
adc byte ptr [ebx], 0
popad ;加上其他的进位
ret
Extended_Add ENDP
当第14行和第15行将两个数组的最低字节相加时,加法运算可能会将进位标志位置 1。因此,第16行将进位标志位压入堆栈进行保存就很重要,因为在循环重复时会用到进位 标志位。第17行保存了和数的第一个字节,第18?20行将三个指针(两个操作数,一个和数)都加 1。第 21 行恢复进位标志位,第 22 行将循环返回到第 14 行。
.data
op1 BYTE 34h,12h,98h,74h,06h,0A4h,0B2h,0A2h
op2 BYTE 02h,45h,23h,00h,00h,87h,10h,80h
sum BYTE 9 dup(0) ; = 0122C32B0674BB5736h
.code
main PROC
mov esi,OFFSET op1 ; 第一个操作数
mov edi,OFFSET op2 ; 第二个操作数
mov ebx,OFFSET sum ; 和数
mov ecx,LENGTHOF op1 ; 字节数
call Extended_Add
; 显示和数
mov esi,OFFSET sum
mov ecx,LENGTHOF sum
call Display_Sum
call Crlf
上述程序的输出如下所示,加法产生了一个进位:0122C32B0674BB5736
过程 Display_Sum 按照正确的顺序显示和数,即从最高字节开始依次显示到最低字节:
Display_Sum PROC
pushad
; 指向左后一个数组
add esi,ecx
sub esi,TYPE BYTE
mov ebx,TYPE BYTE
L1: mov al,[esi] ; 取一个数组字节
call WriteHexB ; 显示该字节
sub esi,TYPE BYTE ; 指向前一个字节
loop L1
popad
ret
Display_Sum ENDP
版权说明:Copyright © 广州松河信息科技有限公司 2005-2025 版权所有 粤ICP备16019765号
广州松河信息科技有限公司 版权所有