带符号加法(用汇编描述)

这篇博客通过汇编语言详细描述了如何实现带符号的加法操作,包括输入两个数字、显示数字、执行加法运算以及处理溢出情况。涉及到的宏指令包括CRLF(换行)、CHAR(打印字符)、ZERO(打印数字0)和FINS(结束程序)。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


CRLF MACRO
     MOV DL,0DH
     MOV AH,02H
     INT 21H

     MOV DL,0AH
     MOV AH,02H
     INT 21H
ENDM

CHAR MACRO
     MOV DL,2DH
     MOV AH,02H
     INT 21H
ENDM

ZERO MACRO
     MOV DL,30H
     MOV AH,02H
     INT 21H
ENDM

FINS MACRO
     MOV AX,4C00H
     INT 21H
ENDM

DATA SEGMENT
ERR   DB 0D,0AH,'INPUT ERROR!',0DH,0AH,'$'
DA1   DB 32 DUP(?)
DA2   DB 32 DUP(?)
CHA   DB 5 DUP(?)
DATA ENDS

STACK SEGMENT
STA  DB 32 DUP(?)
TOP  EQU LENGTH STA
STACK ENDS

CODE SEGMENT
ASSUME CS:CODE,DS:DATA,ES:DATA,SS:STACK

START: MOV AX,DATA
       MOV DS,AX

       MOV AX,STACK
       MOV SS,AX

       MOV AX,TOP
       MOV SP,AX

       LEA SI,DA1
       LEA DI,CHA
       CALL INPUT           ;输入调用

       PUSH CX
       LEA SI,DA1

       LEA DI,CHA
       MOV DX,[DI]
       CMP DX,2DH
       JNZ N1

       CHAR

N1:    CALL DISPL           ;显示加数A
       CRLF

       MOV DL,2BH           ;"+"
       MOV AH,02H
       INT 21H
       CRLF

       LEA SI,DA2
       LEA DI,CHA+1
       CALL INPUT           ;输入调用

       PUSH CX
       LEA SI,DA2

       LEA DI,CHA+1
       MOV DX,[DI]
       CMP DX,2DH
       JNZ N2

       CHAR

N2:    CALL DISPL           ;显示加数B
       CRLF

       MOV DL,3DH           ;"="
       MOV AH,02H
       INT 21H
       CRLF

       POP DX               ;BB
       POP CX               ;AA
       PUSH CX
       PUSH DX

       MOV AL,BYTE PTR CHA
       CMP AL,BYTE PTR CHA+1
       JNZ S1


       LEA AX,DA1           ;AA
       LEA BX,DA2           ;BB

       ADD AX,CX
       ADD BX,DX

       CMP CX,DX            ;比较A,B的位数
       JC  BB1

AA1:   MOV SI,AX            ;A的位数大
       MOV DI,BX
       MOV DX,CX
       POP CX
       PUSH CX
       CALL ADDA

       POP DX
       POP CX
       MOV BX,CX
       LEA SI,DA1

TT:    MOV AL,BYTE PTR CHA
       CMP AL,2DH
       JNZ A1

       CHAR

A1:    CALL DISPL
       CRLF

       FINS                 ;结束,返回DOS

 

BB1:   MOV SI,BX            ;B的位数大
       MOV DI,AX

       CALL ADDA

       POP DX
       MOV BX,DX
       LEA SI,DA2
       JMP TT

S1:    CMP CX,DX            ;比较A,B位数
       JG  AA2
       JC  BB2

CC2:   LEA SI,DA1           ;A,B位数相同
       LEA DI,DA2

C2:    MOV AL,[SI]
       MOV BL,[DI]
       CMP AL,BL
       JG  AA2              ;A大
       JC  BB2              ;B大
       INC SI
       INC DI
       DEC CX
       JNZ C2

       ZERO                 ;输出0
      
       FINS

AA2:   LEA AX,DA1           ;A的位数大
       LEA BX,DA2

       POP DX               ;BB
       POP CX               ;AA
       PUSH CX
       PUSH DX

       ADD AX,CX
       ADD BX,DX

       MOV SI,AX
       MOV DI,BX
       MOV DX,CX
       POP CX
       PUSH CX
       CALL SUBS

       POP DX
       POP CX
       MOV BX,CX
       LEA SI,DA1

       JMP TT

BB2:   LEA AX,DA1           ;B的位数大
       LEA BX,DA2

       POP DX               ;BB
       POP CX               ;AA
       PUSH CX
       PUSH DX

       ADD AX,CX
       ADD BX,DX

       MOV SI,BX
       MOV DI,AX
       CALL SUBS

       POP DX
       MOV BX,DX
       LEA SI,DA2

       MOV AL,BYTE PTR CHA+1
       CMP AL,2DH
       JNZ B2
      
       CHAR

B2:    CALL DISPL
       CRLF

       FINS                 ;结束,返回DOS

DISPL PROC NEAR             ;子功能-显示
DS0:   MOV DL,[SI]
       CMP DL,00H
       JNZ DS2
       INC SI
       DEC BX
       JNZ DS0

       ZERO
       RET

DS1:   MOV DL,[SI]
DS2:   ADD DL,30H

       MOV AH,02H
       INT 21H
       INC SI
       DEC BX                ;修改偏移量
       JNZ DS1

       RET
DISPL ENDP

INPUT PROC NEAR
       XOR CX,CX             ;CX清零
       MOV BYTE PTR[SI],00H  ;最高位0
       MOV BYTE PTR[DI],00H 
       INC SI
       INC CX

FF:    MOV AH,01H
       INT 21H

       CMP AL,0DH
       JZ  NEXT

       CMP AL,2DH
       JZ  D1

       SUB AL,30H
       JC  ER

       CMP AL,0AH
       JNC ER

       MOV [SI],AL
       INC SI
       INC CX
       CMP CX,1FH
       JC  FF

NEXT:  CMP CX,01H
       JZ  ER
       MOV BX,CX
       RET

ER:    LEA DX,ERR
       MOV AH,09H
       INT 21H

       CRLF

       JMP FF

D1:    MOV BYTE PTR[DI],2DH
       JMP FF

INPUT ENDP

ADDA PROC NEAR              ;加法
       CLC
       DEC SI
       DEC DI

ADD1:  MOV AL,[SI]
       MOV BL,[DI]
       ADC AL,BL
       AAA
       MOV [SI],AL
       DEC SI
       DEC DI
       DEC DX
       DEC CX
       JNZ ADD1

ADD2:  MOV AL,[SI]           ;最高位加
       ADC AL,00H
       AAA
       MOV [SI],AL
       PUSHF
       CMP DX,00H
       JZ  ADD3
       POPF
       DEC SI
       DEC DI
       DEC DX
       JNZ ADD2
       RET

ADD3:  POPF
       RET
ADDA ENDP
 
SUBS PROC NEAR              ;减法
       CLC
       DEC SI
       DEC DI

SUB1:  MOV AL,[SI]
       MOV BL,[DI]
       SBB AL,BL
       AAS
       MOV [SI],AL
       DEC SI
       DEC DI
       DEC DX
       DEC CX
       JNZ SUB1

SUB2:  MOV AL,[SI]           ;最高位减
       SBB AL,00H
       AAS
       MOV [SI],AL
       PUSHF
       CMP DX,00H
       JZ  SUB3
       POPF
       DEC SI
       DEC DI
       DEC DX
       JNZ SUB2
       RET

SUB3:  POPF
       RET
 SUBS ENDP

CODE ENDS
     END START


 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值