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

题目:
给出三个有符号数,编写一个比较相等关系的程序:
(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

执行结果截图:
在这里插入图片描述

  • 2
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
以下是一份使用汇编语言实现的全班成绩排序程序: ``` .model small .stack 100h .data arr db 90h, 80h, 70h, 60h, 50h, 40h, 30h, 20h, 10h ; 学生成绩组 n db 9 ; 学生量 .code main proc mov ax, @data mov ds, ax ; 初始化数据段寄存器 mov cl, n ; 循环次 dec cl ; 循环次减 1 mov si, offset arr ; 学生成绩组首地址 outer_loop: mov di, si ; 将当前元素的地址存入 di 寄存器 inc di ; 取下一个元素的地址 inner_loop: cmp cl, 0 ; 检查循环次是否为 0 je end_outer_loop ; 如果循环次为 0,跳出外层循环 mov al, [si] ; 将当前元素存入 al 寄存器 mov bl, [di] ; 将下一个元素存入 bl 寄存器 cmp al, bl ; 比较 al 和 bl 的大小 jge skip_swap ; 如果 al 大于等于 bl,则跳过交换操作 ; 交换当前元素和下一个元素的值 mov ah, [si] mov [si], [di] mov [di], ah skip_swap: inc di ; 取下一个元素的地址 loop inner_loop ; 继续内层循环 dec cl ; 循环次减 1 mov si, offset arr ; 学生成绩组首地址 loop outer_loop ; 继续外层循环 end_outer_loop: mov ah, 4ch int 21h ; 程序结束 main endp end main ``` 该程序使用冒泡排序算法对学生成绩组进行排序,从而将所有学生按照成绩从高到低排列。具体而言,程序使用两层循环遍历组中的每个元素,并通过比较相邻两个元素的大小来交换它们的值。这样,经过多次循环之后,组中的元素就能够按照从大到小的顺序排列了。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值