1. adc => add carry
- add ax,bx => ax + bx + carry
; 32位加法
assume cs:code,ds:data,ss:stack
data segment
db 256 dup(0)
data ends
stack segment stack
db 128 dup (0)
stack ends
code segment
start:
mov ax, stack
mov ss, ax
mov sp,128
mov ax, 0FFFFH
mov dx, 1000H
add ax, 0FFFFH
adc dx,0
; AX=FFFF BX=0000 CX=0199 DX=1000 SP=0080 BP=0000 SI=0000 DI=0000
; DS=0E14 ES=0E14 SS=0E34 CS=0E3C IP=000E NV UP EI PL NZ NA PO NC
; 0E3C:000E 83C0FF ADD AX,-01
; -t
; AX=FFFE BX=0000 CX=0199 DX=1000 SP=0080 BP=0000 SI=0000 DI=0000
; DS=0E14 ES=0E14 SS=0E34 CS=0E3C IP=0011 NV UP EI NG NZ AC PO CY
; 0E3C:0011 83D200 ADC DX,+00
; -t
; AX=FFFE BX=0000 CX=0199 DX=1001 SP=0080 BP=0000 SI=0000 DI=0000
; DS=0E14 ES=0E14 SS=0E34 CS=0E3C IP=0014 NV UP EI PL NZ NA PO NC
; 0E3C:0014 B8004C MOV AX,4C00
mov ax,4C00H
int 21H
code ends
end start
2. 128 位加法
assume cs:code,ds:data,ss:stack
data segment
dw 2222H,3333H,4444H,5555H,6666H,7777H,8888H,9999H
dw 0FFFFH,0FFFFH,0FFFFH,0FFFFH,0FFFFH,0FFFFH,0FFFFH,0FFFFH
dw 8 dup(0)
data ends
stack segment stack
db 128 dup (0)
stack ends
code segment
start:
mov ax, stack
mov ss, ax
mov sp,128
call add_number
mov ax,4C00H
int 21H
;--------------------------------------
init_reg:
mov bx,data
mov ds,bx
mov es,bx
; -d ds:0
; 0E24:0000 22 22 33 33 44 44 55 55-66 66 77 77 88 88 99 99 ""33DDUUffww....
; 0E24:0010 FF FF FF FF FF FF FF FF-FF FF FF FF FF FF FF FF ................
; 0E24:0020 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ................
ret
;--------------------------------------
add_number:
call init_reg
mov si,0
mov bx,16
mov di,32
call add_128
ret
;--------------------------------------
add_128:
push ax
push bx
push cx
push ds
push es
push si
push di
sub ax,ax ; cf = 0
mov cx,8
add128:
mov ax, ds:[si]
adc ax, ds:[bx]
mov es:[di],ax
; 0E2F:0034 8B04 MOV AX,[SI] DS:0000=2222
; -d ds:0
; 0E24:0000 22 22 33 33 44 44 55 55-66 66 77 77 88 88 99 99 ""33DDUUffww....
; 0E24:0010 FF FF FF FF FF FF FF FF-FF FF FF FF FF FF FF FF ................
; 0E24:0020 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ................
; -t
; AX=2222 BX=0010 CX=0008 DX=0000 SP=006E BP=0000 SI=0000 DI=0020
; DS=0E24 ES=0E24 SS=0E27 CS=0E2F IP=0036 NV UP EI PL ZR NA PE NC
; 0E2F:0036 1307 ADC AX,[BX] DS:0010=FFFF
; -t
; AX=2221 BX=0010 CX=0008 DX=0000 SP=006E BP=0000 SI=0000 DI=0020
; DS=0E24 ES=0E24 SS=0E27 CS=0E2F IP=0038 NV UP EI PL NZ AC PE CY
; 0E2F:0038 26 ES:
; 0E2F:0039 8905 MOV [DI],AX ES:0020=0000
; -d es:0
; 0E24:0000 22 22 33 33 44 44 55 55-66 66 77 77 88 88 99 99 ""33DDUUffww....
; 0E24:0010 FF FF FF FF FF FF FF FF-FF FF FF FF FF FF FF FF ................
; 0E24:0020 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ................
; -t
; AX=2221 BX=0010 CX=0008 DX=0000 SP=006E BP=0000 SI=0000 DI=0020
; DS=0E24 ES=0E24 SS=0E27 CS=0E2F IP=003B NV UP EI PL NZ AC PE CY
; 0E2F:003B 46 INC SI
; -d es:0
; 0E24:0000 22 22 33 33 44 44 55 55-66 66 77 77 88 88 99 99 ""33DDUUffww....
; 0E24:0010 FF FF FF FF FF FF FF FF-FF FF FF FF FF FF FF FF ................
; 0E24:0020 21 22 00 00 00 00 00 00-00 00 00 00 00 00 00 00 !"..............
; 0E24:0030 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ................
; 2222 + FFFF = 1 2221, CY = 1, 高位
; 第二次循环
; AX=3333 BX=0012 CX=0007 DX=0000 SP=006E BP=0000 SI=0002 DI=0022
; DS=0E24 ES=0E24 SS=0E27 CS=0E2F IP=0036 NV UP EI PL NZ NA PE CY
; 0E2F:0036 1307 ADC AX,[BX] DS:0012=FFFF
; -t
; AX=3333 BX=0012 CX=0007 DX=0000 SP=006E BP=0000 SI=0002 DI=0022
; DS=0E24 ES=0E24 SS=0E27 CS=0E2F IP=0038 NV UP EI PL NZ AC PE CY
; 0E2F:0038 26 ES:
; 0E2F:0039 8905 MOV [DI],AX ES:0022=0000
; -t
; AX=3333 BX=0012 CX=0007 DX=0000 SP=006E BP=0000 SI=0002 DI=0022
; DS=0E24 ES=0E24 SS=0E27 CS=0E2F IP=003B NV UP EI PL NZ AC PE CY
; 0E2F:003B 46 INC SI
; -d es:0
; 0E24:0000 22 22 33 33 44 44 55 55-66 66 77 77 88 88 99 99 ""33DDUUffww....
; 0E24:0010 FF FF FF FF FF FF FF FF-FF FF FF FF FF FF FF FF ................
; 0E24:0020 21 22 33 33 00 00 00 00-00 00 00 00 00 00 00 00 !"33............
; 3333 + FFFF = 1 3332, CY = 1, 高位, 3332 + 第一次循环的 CY = 3332 + 1 = 3333
; 最终
; -d es:0
; 0E24:0000 22 22 33 33 44 44 55 55-66 66 77 77 88 88 99 99 ""33DDUUffww....
; 0E24:0010 FF FF FF FF FF FF FF FF-FF FF FF FF FF FF FF FF ................
; 0E24:0020 21 22 33 33 44 44 55 55-66 66 77 77 88 88 99 99 !"33DDUUffww....
inc si ; 不能 add si,1 => 会影响标志位
inc si
inc di
inc di
inc bx
inc bx
loop add128
pop di
pop si
pop es
pop ds
pop cx
pop bx
pop ax
ret
code ends
end start