汇编语言,两数相乘或相加帮忙解释
发布网友
发布时间:2022-04-24 04:25
我来回答
共2个回答
热心网友
时间:2022-04-24 15:59
;这够详细了
;如果哪里不懂,你指出来吧!
;=======================================================
;CRLF宏定义
;功能:回车换行
CRLF MACRO
MOV DL,0DH
MOV AH,02H
INT 21H
MOV DL,0AH
MOV AH,02H
INT 21H
ENDM
DATA SEGMENT
DATA1 DB 5 DUP(0)
DATA2 DB 5 DUP(0)
RESULT DB 6 DUP(?)
DATA ENDS
STACK SEGMENT PARA STACK 'STACK'
STA DB 20 DUP(?)
TOP EQU LENGTH STA
STACK ENDS
CODE SEGMENT
ASSUME CS:CODE,DS:DATA,SS:STACK
START: MOV AX,DATA
MOV DS,AX ;初始化数据段寄存器
MOV AX,STACK
MOV SS,AX
MOV AX,TOP
MOV SP,AX ;这个紧随MOV SS,AX较妥当,所以MOV SP,TOP就好,SP又不是段寄存器
MOV SI,OFFSET DATA2
MOV BX,05
CALL INKEY ;输入DATA2,之所以先输入DATA2,是为了在ADDA之前少一个MOV SI,OFFSET DATA1
CRLF ;宏调用换行,下同
MOV SI,OFFSET DATA1
MOV BX,05
CALL INKEY
CRLF
MOV DI,OFFSET DATA2
CALL ADDA ;加法
MOV SI,OFFSET DATA1
MOV BX,06
CALL DISPL ;显示输出
CRLF
MOV AX,4C00H
INT 21H
;DISPL子程序定义
;功能:打印字符串
;参数:SI=字符串首地址
; BX=字符串长度
;返回:NONE
DISPL PROC NEAR
DS1: MOV AH,02
MOV DL,[SI+BX-1]
INT 21H
DEC BX
JNZ DS1
RET
DISPL ENDP
;INKEY子程序定义
;功能:输入字符串
;参数:SI=字符串首地址
; BX=字符串长度
;返回:NONE
INKEY PROC NEAR
IN1: MOV AH,01
INT 21H
MOV [SI+BX-1],AL
DEC BX
JNZ IN1
RET
INKEY ENDP
;INKEY子程序定义
;功能:多位加法
;参数:SI=目标字符串首地址
; SI=目标字符串首地址
; BX=字符串长度
;返回:NONE
ADDA PROC NEAR
MOV DX,SI
MOV BP,DI
MOV BX,05
AD1: SUB BYTE PTR [SI+BX-1],30H
SUB BYTE PTR [DI+BX-1],30H
DEC BX
JNZ AD1 ;转换字串为数字
MOV SI,DX
MOV DI,BP
MOV CX,05
CLC
AD2: MOV AL,[SI]
MOV BL,[DI]
ADC AL,BL ;带进位加法
AAA ;非压缩BCD加法调整
MOV [SI],AL ;保存结果
INC SI
INC DI
LOOP AD2
;------------------------------
MOV AL,00H
ADC AL,00H
MOV [SI],AL
;------------------------------
;处理最高位
;就是[SI]+CF->[SI]
;我可能会这么写
;JNC YC
;INC BYTE PTR [SI]
;YC:
MOV SI,DX
MOV DI,BP
MOV BX,06
AD3: ADD BYTE PTR [SI+BX-1],30H
ADD BYTE PTR [DI+BX-1],30H
DEC BX
JNZ AD3 ;转换数为字串
RET
ADDA ENDP
CODE ENDS
END START
热心网友
时间:2022-04-24 17:17
;这够详细了
;如果哪里不懂,你指出来吧!
;=======================================================
;CRLF宏定义
;功能:回车换行
CRLF
MACRO
MOV
DL,0DH
MOV
AH,02H
INT
21H
MOV
DL,0AH
MOV
AH,02H
INT
21H
ENDM
DATA
SEGMENT
DATA1
DB
5
DUP(0)
DATA2
DB
5
DUP(0)
RESULT
DB
6
DUP(?)
DATA
ENDS
STACK
SEGMENT
PARA
STACK
'STACK'
STA
DB
20
DUP(?)
TOP
EQU
LENGTH
STA
STACK
ENDS
CODE
SEGMENT
ASSUME
CS:CODE,DS:DATA,SS:STACK
START:
MOV
AX,DATA
MOV
DS,AX
;初始化数据段寄存器
MOV
AX,STACK
MOV
SS,AX
MOV
AX,TOP
MOV
SP,AX
;这个紧随MOV
SS,AX较妥当,所以MOV
SP,TOP就好,SP又不是段寄存器
MOV
SI,OFFSET
DATA2
MOV
BX,05
CALL
INKEY
;输入DATA2,之所以先输入DATA2,是为了在ADDA之前少一个MOV
SI,OFFSET
DATA1
CRLF
;宏调用换行,下同
MOV
SI,OFFSET
DATA1
MOV
BX,05
CALL
INKEY
CRLF
MOV
DI,OFFSET
DATA2
CALL
ADDA
;加法
MOV
SI,OFFSET
DATA1
MOV
BX,06
CALL
DISPL
;显示输出
CRLF
MOV
AX,4C00H
INT
21H
;DISPL子程序定义
;功能:打印字符串
;参数:SI=字符串首地址
;
BX=字符串长度
;返回:NONE
DISPL
PROC
NEAR
DS1:
MOV
AH,02
MOV
DL,[SI+BX-1]
INT
21H
DEC
BX
JNZ
DS1
RET
DISPL
ENDP
;INKEY子程序定义
;功能:输入字符串
;参数:SI=字符串首地址
;
BX=字符串长度
;返回:NONE
INKEY
PROC
NEAR
IN1:
MOV
AH,01
INT
21H
MOV
[SI+BX-1],AL
DEC
BX
JNZ
IN1
RET
INKEY
ENDP
;INKEY子程序定义
;功能:多位加法
;参数:SI=目标字符串首地址
;
SI=目标字符串首地址
;
BX=字符串长度
;返回:NONE
ADDA
PROC
NEAR
MOV
DX,SI
MOV
BP,DI
MOV
BX,05
AD1:
SUB
BYTE
PTR
[SI+BX-1],30H
SUB
BYTE
PTR
[DI+BX-1],30H
DEC
BX
JNZ
AD1
;转换字串为数字
MOV
SI,DX
MOV
DI,BP
MOV
CX,05
CLC
AD2:
MOV
AL,[SI]
MOV
BL,[DI]
ADC
AL,BL
;带进位加法
AAA
;非压缩BCD加法调整
MOV
[SI],AL
;保存结果
INC
SI
INC
DI
LOOP
AD2
;------------------------------
MOV
AL,00H
ADC
AL,00H
MOV
[SI],AL
;------------------------------
;处理最高位
;就是[SI]+CF->[SI]
;我可能会这么写
;JNC
YC
;INC
BYTE
PTR
[SI]
;YC:
MOV
SI,DX
MOV
DI,BP
MOV
BX,06
AD3:
ADD
BYTE
PTR
[SI+BX-1],30H
ADD
BYTE
PTR
[DI+BX-1],30H
DEC
BX
JNZ
AD3
;转换数为字串
RET
ADDA
ENDP
CODE
ENDS
END
START