汇编语言:根据数值进行求和或清零
题目要求运行截图
编程平台代码实现
题目要求
设在A、B和D字单元中已经分别存放着三个数。 若三个数都不是0,则求出三个数的和,并存放在S字单元中;若其中有一个数为0,则把其他两个单元也清零。 将A、B、D、S这四个字单元处理前后的数值展示出来。
运行截图
编程平台
Masm for Windows 集成实验环境 2012.5
代码实现
DATAS SEGMENT
A DW 25
B DW 34
D DW 111
S DW 0
hint DB
'--Before--',13
,10
,'$'
result DB
'--After--',13
,10
,'$'
break DB 13
,10
,'$';换行符
scale DW 10
;以十进制形式输出数值
DATAS ENDS
STACKS SEGMENT STACK
DB 200H DUP
(?
)
STACKS ENDS
CODES SEGMENT
ASSUME CS:CODES
,DS:DATAS
,SS:STACKS
MAIN PROC
MOV AX
,DATAS
MOV DS
,AX
LEA DX
,hint
;输出原始数据前的提示
MOV AH
,9H
INT 21H
CALL OUTPUTALL
;输出A、B、D、S的数值
;分别测试A、B、D中的数据是否为0,出现一个为0则全部清0
MOV AX
,A
CMP AX
,0
;测试A中的数据是否为0
JE cle
MOV BX
,B
CMP BX
,0
;测试B中的数据是否为0
JE cle
MOV DX
,D
CMP DX
,0
;测试D中的数据是否为0
JE cle
;对A、B、D进行求和,结果放入S
ADD AX
,BX
ADD AX
,DX
LEA
SI,S
MOV
[SI],AX
JMP outp
cle:
CALL CLEAR
;将A、B、D中的数据清0
outp:
LEA DX
,result
;输出当前数据前的提示
MOV AH
,9H
INT 21H
CALL OUTPUTALL
;输出A、B、D、S的数值
MOV AH
,4CH
INT 21H
MAIN ENDP
;子程序
;功能:输出A、B、D、S存放的数据。
OUTPUTALL PROC
MOV DL
,'A';输出A的内容
MOV AH
,2H
INT 21H
MOV DL
,':';冒号
MOV AH
,2H
INT 21H
MOV AX
,A
CALL OUTPUTDATA
;以scale进制形式输出数据
LEA DX
,break;输出换行符
MOV AH
,9H
INT 21H
MOV DL
,'B';输出B的内容
MOV AH
,2H
INT 21H
MOV DL
,':';冒号
MOV AH
,2H
INT 21H
MOV AX
,B
CALL OUTPUTDATA
;以scale进制形式输出数据
LEA DX
,break;输出换行符
MOV AH
,9H
INT 21H
MOV DL
,'D';输出D的内容
MOV AH
,2H
INT 21H
MOV DL
,':';冒号
MOV AH
,2H
INT 21H
MOV AX
,D
CALL OUTPUTDATA
;以scale进制形式输出数据
LEA DX
,break;输出换行符
MOV AH
,9H
INT 21H
MOV DL
,'S';输出S的内容
MOV AH
,2H
INT 21H
MOV DL
,':';冒号
MOV AH
,2H
INT 21H
MOV AX
,S
CALL OUTPUTDATA
;以scale进制形式输出数据
LEA DX
,break;输出换行符
MOV AH
,9H
INT 21H
RET
OUTPUTALL ENDP
;子程序
;功能:将数据以scale进制形式输出。
;入口参数:AX存放要输出的数据,scale存放进制数。
OUTPUTDATA PROC
MOV BX
,scale
TEST AX
,8000H
;判断正负
JZ pos
PUSH AX
MOV DL
,'-';输出负号
MOV AH
,2H
INT 21H
POP AX
NEG AX
;求补,得到负数的绝对值
pos:
MOV
SI,0
;记录要输出的位数
lop1:
MOV DX
,0
DIV BX
PUSH DX
;余数入栈
INC
SI
CMP AX
,0
JNE lop1
lop2:
POP DX
ADD DL
,30H
;转换成ASCII码
MOV AH
,2H
INT 21H
DEC
SI
CMP
SI,0
JNE lop2
RET
OUTPUTDATA ENDP
;子程序
;功能:将A、B、D中的数据清0。
CLEAR PROC
MOV AX
,0
LEA
SI,A
MOV
[SI],AX
LEA
SI,B
MOV
[SI],AX
LEA
SI,D
MOV
[SI],AX
RET
CLEAR ENDP
CODES ENDS
END MAIN
如果文章内容出错或者您有更好的解决方法,欢迎到评论区指正和讨论!