adc

Tutorial: 汇编基础 Category: C语言 Published: 2026-04-07 13:58:26 Views: 20 Likes: 0 Comments: 0
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
Prev: 检测点11.1 Next: sbb