题目:
给出三个有符号数,编写一个比较相等关系的程序:
(1) 如果这三个数都不相等,则显示0;
(2) 如果这三个数中有两个数相等,则显示1;
(3) 如果这三个数都相等,则显示2;
代码:
.model small
.stack
.data;给出三个数据
msgst db 'input three number:',0dh,0ah,'$'
var1 db ?
var2 db ?
var3 db ?
temp db ?
msg0 db '0$'
msg1 db '1$'
msg2 db '2$'
.code
.startup
mov dx,offset msgst
mov ah,9
int 21h ;显示提示信息
call readsiw ;第一个数
mov al,temp
mov var1,al
call readsiw ;第二个数
mov al,temp
mov var2,al
call readsiw ;第三个数
mov al,temp
mov var3,al
mov al,var1
cmp al,var2 ;12
je equal ;如果相等,跳转
jnz again
equal:
cmp al,var3 ;23
je second ;三个数据全部相等
jnz first ;1=2 2!=3 三个数据中有两个相等
again: ;1!=2
mov al,var1
cmp al,var3
je first ;1=3
jnz again1 ;1!=3
again1:
mov al,var2
cmp al,var3
je first
jnz zone
jmp done
zone:
mov dx,offset msg0
jmp done
first:
mov dx,offset msg1
jmp done
second:
mov dx,offset msg2
jmp done
done:
mov ah,9
int 21h
.exit
readsiw proc
push ax ;保护寄存器
push bx
push cx
xor bx,bx ;bx保存结果
xor cx,cx ;cx为正负标志,0为正,-1为负,默认为正
rsiw0: mov ah,1;输入第一个字符,正号或者负号
int 21h
cmp al,'+'
jz rsiw1 ;如果是正,cx原本就是0,向下继续输字符,zf=1跳转
cmp al,'-'
jnz rsiw2 ;如果不是负,则输入的不对
mov cx,-1 ;输入的是负数,设置cx=-1
rsiw1:mov ah,1
int 21h
rsiw2:cmp al,'0' ;不是0~9之间数码,结束
jb rsiw3 ;低于0
cmp al,'9'
ja rsiw3 ;高于9
sub al,30h ;是0~9之间的数码,转换,字符0的ascii码是30H
xor ah,ah ;AL零位扩展为AX
shl bx,1
shl bx,1
add bx,dx
add bx,ax ;原数乘10后,与新数码相加
jmp rsiw1 ;继续转换下一个数位
rsiw3:cmp cx,0 ;判断是正数还是负数
jz rsiw4 ;是正数,跳转
neg bx ;是负数,进行求补
rsiw4: mov temp,bl ;设置出口参数
pop cx
pop bx
pop ax
ret ;子程序返回
readsiw endp
end
执行结果截图: