用汇编语言实现从键盘输入两个2位数并进行相加,最后输出结果
发布网友
发布时间:2022-06-03 14:04
我来回答
共3个回答
热心网友
时间:2023-10-20 23:10
DATAS SEGMENT ;数据段
DATA1 DB 31H,32H,38H,34H,37H ;定义DATA1为被加数
DATA2 DB 34H,35H,39H,37H,31H ;定义DATA2为加数
DATAS ENDS
STACKS SEGMENT ;堆栈段
STA DB 64 DUP(0) ;(伪指令)为STA预留64个字节的存储空间
SP_TOP DB 0 ;定义SP_TOP单元的数值为0
STACKS ENDS
CODES SEGMENT ;代码段
ASSUME CS:CODES,DS:DATAS,ES:DATAS,SS:STACKS
START:
MOV AX,DATAS
MOV DS,AX ; 设置数据段
MOV AX,STACKS
MOV SS,AX ; 设置堆栈段
LEA SP,SP_TOP ; 设置栈顶指针
MOV SI,OFFSET DATA1 ;把DATA1偏移量地址赋予SI
MOV BX,05 ;
CALL DISPL ; 显示被加数
CALL CRLF ; 回车、换行
MOV SI,OFFSET DATA2 ; 把DATA2偏移量地址赋予SI
MOV BX,05 ;
CALL DISPL ; 显示加数
CALL CRLF ; 回车、换行
MOV DI,OFFSET DATA1 ; 把DATA1偏移量地址赋予DI
CALL ADDA ;调用ADDA子程序,实行加法运算
MOV BX,05 ;
CALL DISPL ; 显示结果
CALL CRLF ; 回车、换行
MOV AX,4C00H ;
INT 21H ;调用DOS21H功能,返回
CRLF PROC NEAR ;回车、显示功能过程定义,属性为NEAR
MOV DL,0DH ;把回车的ASCII码0DH传给DL
MOV AH,02H ;送DOS 的中断调用功能号
INT 21H ; DOS 的中断调用
MOV DL,0AH ; 把换行的ASCII码0AH传给DL
MOV AH,02H ; 送DOS 的中断调用功能号
INT 21H ; DOS 的中断调用
RET ; 返回
CRLF ENDP ;完成过程定义
DISPL PROC NEAR ;显示功能过程定义,属性为NEAR
DSL: MOV AH,02 ;送显示功能号
MOV DL,[SI+BX-1] ;显示字符串中一字符
INT 21H ; DOS 的中断调用
DEC BX ;BX减1,修改偏移量
JNZ DSL ;如果BX未减到零,跳到DSL执行指令
RET ;返回
DISPL ENDP ;完成显示功能子程序定义
ADDA PROC NEAR ;实行加法运算子程序过程定义,属性为NEAR
MOV DX,SI
MOV BP,DI
MOV BX,05
TRAN_HEX: SUB BYTE PTR[SI+BX-1],30H ;把ASCII码数转化为十六进制
SUB BYTE PTR[DI+BX-1],30H
DEC BX ; BX减1,修改偏移量
JNZ TRAN_ HEX ; 如果BX未减到零,跳到TRAN_ HEX执行指令
MOV SI,DX
MOV DI,BP
MOV CX,05 ; 包括进位,共5位
CLC ;进位标志位CF清零 (clear carry flag)
THE_ADD: MOV AL,[SI]
MOV BL,[DI]
ADC AL,BL ; 带进位相加,把结果存在AX
AAA ;进行AAA调整,非结合BCD码的加法调整
MOV [SI],AL ; 结果送被加数区
INC SI ;SI加1
INC DI ;DI加1(指向下一位)
LOOP THE_ADD ;循环
MOV SI,DX
MOV DI,BP
MOV BX,05
TRAN_ASCI: ADD BYTE PTR[SI+BX-1],30H
ADD BYTE PTR[DI+BX-1],30H
;使用PTR转换属性并相加,将十六进制数转化为ASCII表示
DEC BX ; BX减1,修改偏移量
JNZ TRAN_ASCI ; 如果BX未减到零,跳到TRAN_ASCI 执行指令
RET ;返回
ADDA ENDP ;加法子程序定义完成
CODES ENDS ;代码段完成
END START
热心网友
时间:2023-10-20 23:11
CRLF MACRO ;定义回车换行的宏命令 宏指令名crlf
MOV DL,0DH
MOV AH,02H
INT 21H ;int 21h 执行功能调用
MOV DL,0AH
MOV AH,02H
INT 21H
ENDM
DATA SEGMENT ;定义数据段 segment定义段,段名为segment
DATA1 DB 20 DUP(?) ;加数
DATA2 DB 20 DUP(?) ;被加数
DATA ENDS
STACK SEGMENT ;堆栈段
STA DB 20 DUP(?)
TOP EQU LENGTH STA
STACK ENDS
CODE SEGMENT ;程序段
ASSUME CS:CODE,DS:DATA,SS:STACK,ES:DATA ;assume规定段所属的段寄存器
START: MOV AX,DATA ;数据段地址DS
MOV DS,AX
MOV AX,STACK ;确定堆栈
MOV SS,AX
MOV AX,TOP
MOV SP,AX
MOV BX,02
MOV SI,OFFSET DATA1 ;设置指针
CALL INPUT ;调用输入函数INPUT
CRLF
MOV BX,02 ;调用输入函数
MOV SI,OFFSET DATA2
CALL INPUT
CRLF
CRLF
MOV SI,OFFSET DATA2 ;显示被加数
MOV BX,02 ;2位
CALL DISPL
CRLF
MOV SI,OFFSET DATA1 ;取加数地址,显示加数
MOV BX,02
CALL DISPL
CRLF
MOV DI,OFFSET DATA2 ;取被加数首址
CALL ADDA ;执行加法
MOV SI,OFFSET DATA1 ;显示结果
MOV BX,02
CALL DISPL
CRLF
MOV AX,4C00H ;程序结束 返回DOS
INT 21H
DISPL PROC NEAR ;proc指示过程开始,过程名proc near定义近指针
DSI: MOV AH,02
MOV DL,[SI+BX-1]
INT 21H ;这三句为显示输出,被输出的字符送DL
DEC BX
JNZ DSI
RET ;返回DOS,不过是有条件的,
DISPL ENDP
ADDA PROC NEAR
MOV DX,SI
MOV BP,DI
MOV BX,02
AD1: SUB BYTE PTR[SI+BX-1],30H ;byte指示字节长度的操作数 byte ptr
SUB BYTE PTR[DI+BX-1],30H
DEC BX
JNZ AD1
MOV SI,DX
MOV DI,BP
MOV CX,02
CLC
AD2: MOV AL,[SI]
MOV BL,[DI]
ADC AL,BL
AAA
MOV [SI],AL
INC SI
INC DI ;inc加,dec减
LOOP AD2
MOV SI,DX
MOV DI,BP
MOV BX,02
AD3: ADD BYTE PTR[SI+BX-1],30H
ADD BYTE PTR[DI+BX-1],30H
DEC BX
JNE AD3
RET
INPUT PROC NEAR ;函数的输入
IN1:MOV AH,01
INT 21H ;这两句,从键盘输入数,并回显 字符到AL,AL中为ASCII码
MOV [SI],AL
INC SI
DEC BX
JNZ IN1 ;in1为0时循环结束
RET
INPUT ENDP
ADDA ENDP
CODE ENDS
END START
热心网友
时间:2023-10-20 23:11
.model small
.386
.stack
.data
a db ?
b db ?
sum db ?
.code
main proc far
mov ax,@data
mov ds,ax
call decibin
mov a,bl
call decibin
mov b,bl
add bl,a
mov sum,bl
call bindec
exit1:
mov ax,4c00h
int 21h
main endp
decibin proc near
mov ah,1
int 21h
and al,0fh
mov bl,al
cmp al,0
jl exit
cmp al,9d
jg exit
mov ah,1
int 21h
and al,0fh
cmp al,0
jl exit
cmp al,9d
jg exit
xchg bl,al
mov cl,10d
mul cl
xchg al,bl
add bl,al
exit:
ret
decibin endp
bindec proc
xor ax,ax
xor cx,cx
mov al,bl
mov bl,10
Dopush:
div bl
push bx
inc cx
test al,al
jnz Dopush
mov ah,2
mov dl,0dh
int 21h
mov ah,2
mov dl,0ah
int 21h
Dopop:
pop dx
mov ah,2
int 21h
loop Dopop
ret
bindec endp
end main