汇编语言能不能实现多字节加法?

leeak 2003-11-13 09:42:58
听说可以用加法器 实现多字节加法
谁给我个例子阿
最好简单些
谢谢
...全文
632 2 打赏 收藏 转发到动态 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
fanoble 2003-11-14
  • 打赏
  • 举报
回复
;=========================== 任意位十进制数相加 ==============================
N EQU 10 ;定义最大位数
M EQU N+1

;=============================================================================
;=============================================================================

CODE SEGMENT ;代码段,COM格式
ORG 100H
ASSUME CS:CODE,DS:CODE,ES:CODE,SS:CODE
START:
JMP MAIN ;跳过数据
;-----------------------------------------------------------------------------
BUF1 DB M ;输入缓冲1
LEN1 DB 0 ;输入缓冲1长度
NUM1 DB M DUP (0) ;输入缓冲1数据
BUF2 DB M ;输入缓冲2
LEN2 DB 0 ;输入缓冲2长度
NUM2 DB M DUP (0) ;输入缓冲2数据
RESULT DB 0,M DUP ('$') ;结果,预留一进位

STR1 DB 'Please input number1:$' ;提示信息
STR2 DB 'The result is:$'
;-----------------------------------------------------------------------------
MAIN: ;程序入口
LEA DX,STR1
CALL PRINT ;显示 "Please input numer1:"

LEA DX,BUF1
CALL INPUT ;输入数据到BUF1

XOR CH,CH
MOV CL,BYTE PTR LEN1 ;把数1位数放入CX
LEA SI,NUM1 ;数2起始地址
CALL ASC2BIN ;把ASC码转换为2进制

CALL CRLF ;回车换行

LEA DX,STR1
INC BYTE PTR [STR2-3]
CALL PRINT ;显示 "Please input numer1:"

LEA DX,BUF2
CALL INPUT ;输入数据到BUF2

MOV CL,BYTE PTR LEN2 ;把数2位数放入CX
LEA SI,NUM2 ;数2起始地址
CALL ASC2BIN ;把ASC码转换为2进制

CALL CRLF ;回车换行

LEA DX,STR2
CALL PRINT ;显示 "The Result is:"

; 将大数复制到结果缓冲区
; 先将SI指向大数,DI指向小数
LEA SI,NUM1 ;假设NUM1大
LEA DI,NUM2 ;NUM2小
MOV CL,BYTE PTR LEN1
CMP CL,BYTE PTR LEN2 ;比较2数位数
JA NUM1_GREAT ;NUM1大,假设正确,转
XCHG SI,DI ;NUM1小,NUM2大
NUM1_GREAT:
;复制
MOV CL,[SI-1] ;CL,中放大数位数
PUSH CX ;保存大数位数
PUSH DI ;保存小数地址
MOV DI,OFFSET RESULT+1 ;复制到结果缓冲区,留出最高位
REPZ MOVSB

POP SI ;置SI为小数地址
DEC DI ;置DI为结果最低位地址
POP CX ;置CX为大数位数
PUSH CX
MOV DL,BYTE PTR [SI-1] ;置DX为小数位数
XOR DH,DH
ADD SI,DX
DEC SI ;置SI为小数最地位地址

;计算
CALC:
XOR AX,AX ;为BCD调整清AH
MOV BL,[DI] ;取结果(复制的大数)的一位
CMP DL,0 ;小数是否加完
JNG DO_NOT_LOAD ;小数已加完,用0(AL)代替
;没有的位
MOV AL,[SI] ;小数未加完,取小数的一位
DO_NOT_LOAD:
ADD AL,BL ;相加并做BCD调整
AAA
MOV [DI],AL ;将低位放入结果低位
DEC DI
ADD [DI],AH ;高位加入结果前一位(进位)
DEC SI ;指向小数的前一位
DEC DL ;剩余未加的小数的位数
LOOP CALC

LEA SI,RESULT
POP CX
INC CX ;置CX为结果(大数)位数+1
;(预留的进位)
CALL BIN2ASC ;将2进制转为ASC码

LEA DX,RESULT
MOV AL,[RESULT] ;判断最高位是否为0
AND AL,0FH
JNZ NO_ZERO
INC DX ;为0,跳过最高位显示
NO_ZERO:
CALL PRINT ;显示结果

MOV AH,4CH
INT 21H ;退出

;=============================================================================
;=============================================================================

; ----- 回车换行 -------------------------------------------------------------

CRLF PROC
MOV AH,2
MOV DL,0DH
INT 21H
MOV DL,0AH
INT 21H
RET
CRLF ENDP

; ----- 显示字符串 -----------------------------------------------------------
; DS:DX = 以'$'结尾的字符串首地址

PRINT PROC
MOV AH,9
INT 21H
RET
PRINT ENDP

; ----- 从键盘输入字符串 -----------------------------------------------------
; DS:DX = 输入缓冲区地址

INPUT PROC
MOV AH,0AH
INT 21H
RET
INPUT ENDP

; ----- 将ASC码转为2进制(0-9) ------------------------------------------------
; SI = 数据地址
; CX = 数据长度

ASC2BIN PROC
A2B_LP:
AND BYTE PTR [SI],0FH
INC SI
LOOP A2B_LP
RET
ASC2BIN ENDP

; ----- 将2进制转为ASC码(0-9) ------------------------------------------------
; SI = 数据地址
; CX = 数据长度

BIN2ASC PROC
B2A_LP:
OR BYTE PTR [SI],30H
INC SI
LOOP B2A_LP
RET
BIN2ASC ENDP

;=============================================================================
;=============================================================================

CODE ENDS
END START
紫郢剑侠 2003-11-14
  • 打赏
  • 举报
回复
楼上的强!

收藏!

21,497

社区成员

发帖
与我相关
我的任务
社区描述
汇编语言(Assembly Language)是任何一种用于电子计算机、微处理器、微控制器或其他可编程器件的低级语言,亦称为符号语言。
社区管理员
  • 汇编语言
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧