;+-----------------------------------------------------------
;|将a、b、c三个十六进制无符号数分别与零比较,如果三个数均不为
;|零,求出三个数之和存放在变量d中(假设总和小于65535), 若其中
;|至少有一个数为零,则显示“ERROR!”.
;|来源:http://tieba.baidu.com/p/5981968426
;+-----------------------------------------------------------
;|解题思路:检测一个数就累加一个数,只要检测到该数为0,就输出
;| “ERROR!”,终止程序返回DOS;否则继续检测下一个...
;+-----------------------------------------------------------
;|解题编程:fasmfan
;|完成时间:2018.12.18
;+-----------------------------------------------------------
TITLE myProg
NAME myProg
PAGE 55,132
STACK segment para STACK 'STACK'
db 4 dup('mystacks')
STACK ends
_DATA segment word public 'DATA'
a dw 98h
b dw 33h
c dw 0
d dw ?
errMsg db 'ERROR!',13,10,36
_DATA ends
_TEXT segment word public 'CODE'
assume cs:_TEXT,ds:_DATA,ss:STACK
main proc far
mov ax,_DATA
mov ds,ax
mov ax,[a] ;取数a进ax
cmp ax,0 ;与0比较
jz showErr ;等于0就跳去显示
cmp [b],0 ;否则继续检测b是否等于0
jz showErr ;等于0就跳去显示
add ax,[b] ;否则,ax加b
cmp [c],0 ;...
jz showErr
add ax,[c]
mov [d],ax ;将ax的值复制给d
jmp finish ;
showErr:
mov dx,offset errMsg ;dx取errMsg的首地址
mov ah,9 ;设置显示串的中断编号
int 21h ;执行中断
finish:
mov ax,4c00h;设置退出程序的中断号
int 21h ;执行中断
main endp
_TEXT ends
end main ;程序到此为止,程序运行入口地址是main
;+----------------------------------------------------------
;|后记:题目的陈述是有瑕疵的。数带不带符号与使用什么数制没关
;| 系。但变量能记忆数的大小能力与变量占用存储器字节的多
;| 少是相关的。根据题意,题目所说的十六进制应该是十六位
;+----------------------------------------------------------
;|将a、b、c三个十六进制无符号数分别与零比较,如果三个数均不为
;|零,求出三个数之和存放在变量d中(假设总和小于65535), 若其中
;|至少有一个数为零,则显示“ERROR!”.
;|来源:http://tieba.baidu.com/p/5981968426
;+-----------------------------------------------------------
;|解题思路:检测一个数就累加一个数,只要检测到该数为0,就输出
;| “ERROR!”,终止程序返回DOS;否则继续检测下一个...
;+-----------------------------------------------------------
;|解题编程:fasmfan
;|完成时间:2018.12.18
;+-----------------------------------------------------------
TITLE myProg
NAME myProg
PAGE 55,132
STACK segment para STACK 'STACK'
db 4 dup('mystacks')
STACK ends
_DATA segment word public 'DATA'
a dw 98h
b dw 33h
c dw 0
d dw ?
errMsg db 'ERROR!',13,10,36
_DATA ends
_TEXT segment word public 'CODE'
assume cs:_TEXT,ds:_DATA,ss:STACK
main proc far
mov ax,_DATA
mov ds,ax
mov ax,[a] ;取数a进ax
cmp ax,0 ;与0比较
jz showErr ;等于0就跳去显示
cmp [b],0 ;否则继续检测b是否等于0
jz showErr ;等于0就跳去显示
add ax,[b] ;否则,ax加b
cmp [c],0 ;...
jz showErr
add ax,[c]
mov [d],ax ;将ax的值复制给d
jmp finish ;
showErr:
mov dx,offset errMsg ;dx取errMsg的首地址
mov ah,9 ;设置显示串的中断编号
int 21h ;执行中断
finish:
mov ax,4c00h;设置退出程序的中断号
int 21h ;执行中断
main endp
_TEXT ends
end main ;程序到此为止,程序运行入口地址是main
;+----------------------------------------------------------
;|后记:题目的陈述是有瑕疵的。数带不带符号与使用什么数制没关
;| 系。但变量能记忆数的大小能力与变量占用存储器字节的多
;| 少是相关的。根据题意,题目所说的十六进制应该是十六位
;+----------------------------------------------------------