汇编语言输入数据比较大小

题目:
给出三个有符号数,编写一个比较相等关系的程序:
(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'		;不是09之间数码,结束
		jb rsiw3			;低于0
		cmp al,'9'
		ja rsiw3				;高于9
		sub al,30h		;09之间的数码,转换,字符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

执行结果截图:
汇编语言输入数据比较大小_第1张图片

你可能感兴趣的:(汇编语言)