汇编实验三:三个有符号数比较大小

本实验介绍了一个汇编程序,用于比较三个有符号数的大小关系。程序通过输入三个十六进制数,判断它们是否相等,并根据相等情况显示不同的结果。使用了dos功能调用进行输入输出,涉及数据段、堆栈段和代码段的设置。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

汇编实验三:三个有符号数比较大小

问题

给出三个有符号数,编写一个比较相等关系的程序:
(1) 如果这三个数都不相等,则显示0;
(2) 如果这三个数中有两个数相等,则显示1;
(3) 如果这三个数都相等,则显示2;

源码

DATAS SEGMENT
	D DB 3 DUP(?); 将数据首先保存到D数组
	D1 DW ?
	D2 DW ?
	D3 DW ?
	D4 DB 30h
	MESSAGE DB 'please input three number(hex,1Byte):',13,10,'$' 
    ;此处输入数据段代码  
DATAS ENDS

STACKS SEGMENT
    ;此处输入堆栈段代码
STACKS ENDS

CODES SEGMENT
    ASSUME CS:CODES,DS:DATAS,SS:STACKS
START:
    MOV AX,DATAS
    MOV DS,AX
    LEA DX,MESSAGE
    MOV AH,09H ;dos 9号功能调用输出字符串,以$结尾
    INT 21H   ; 输出提示
    MOV CX, 3H        ;控制输入3个数
    MOV SI,OFFSET D;利用寄存器间接寻址
    ;输入一个数据要求为2位的16进制的数,表示一个字节
INPUT: MOV BX ,0; 将输入的数据暂时保留BX,初始化位0
	MOV AH,01H  ; dos 1号功能调用输入1个字符到AL
	INT 21H  	; 读入字节高位
	CMP Al, 'a' ; 输入的是a..f
	JB C1
	SUB AL,20H; 变成小写字母
C1: CMP AL,'A' ;   
    JB C2
    SUB AL,7H; 与数字‘9’隔7
C2: SUB AL,30H
	MOV BL,AL
	SHL BL,1
	SHL BL,1
	SHL BL,1
	SHL BL,1; 循环左移4位,移到高位
	INT 21H
	CMP Al, 'a' ; 输入的是a..f
	JB C3
	SUB AL,20H; 变成小写字母
C3: CMP AL, 'A' ;  
    JB C4
    SUB AL,7H; 与数字‘9’隔7
C4: SUB AL,30H
	ADD BL,AL
	MOV [SI], BL;将数据送往内存D的位置
	INC SI ; si+1
	MOV AH,02H ; dos 2号功能输出1个字符
	MOV DL,13 ;输出字符
	INT 21H  ; 输出\r使得表示将光标移至行首,dos系统下需要这样做
	MOV DL,10
	INT 21H ; 输入\n 换行
	LOOP INPUT ;循环
	MOV SI,OFFSET D
	MOV AX,0H; 因为AX16,D8位,用Al,所以ax初始化为0
    MOV AL,BYTE PTR [SI]
    MOV D1,AX
    MOV AL,BYTE PTR [SI+1]
    MOV D2,AX
    MOV AL,BYTE PTR [SI+2]
    MOV D3,AX ; 将数据分别送往D1,D2,D3
    MOV AX,D1
    CMP AX,D2
    JE L1 ; D1,D2相等跳转L1位置
    CMP AX,D3
    JE L2
    MOV AX,D2
    CMP AX,D3
    JE L2
    JMP L
L1: MOV D4,31H
	CMP AX,D3
	JNE L
	MOV D4,32H
	JMP L
L2: MOV D4,31H
	JMP L
L:	MOV AH,02H ; dos 2号功能输出1个字符
	MOV DL,D4
	INT 21H
	MOV AH,4CH  ; 随机输入一个字符,用来暂停程序,观看结果
	INT 21H
CODES ENDS
    END START

利用库函数io.inc

参考汇编Dos下16位输入输出io.inc

    include io.inc
    .model small
    .stack
    .data
    d1 dw ?
    d2 dw ?
    d3 dw ?
    .code
    .startup
    ;readsiw 输入有符号十进制整数 (-32768~32767) 出口:AX=16位数据
    ;dispcrlf (回车换行)
    mov dl,'0' ;最后结果
    call readsiw
    call dispcrlf
    mov d1,ax
    call readsiw
    call dispcrlf
    mov d2,ax
    call readsiw
    call dispcrlf
    mov d3,ax ; 此时ax存的内容为d3
    cmp ax,d2 ; 比较d3,d2
    jz L1 ;相等跳转判断d3,d1
    cmp ax,d1 ; 不相等则继续判断d3,d1
    jz L2 ; d3=d1 此时结果为1跳转到L2使得结果+1 
    mov ax,d2 ; d3不等于d1,继续判断d2,d1是否相等
    cmp ax,d1 ;
    jz L2 ; d1=d2 结果为1
    jmp outc ;不相等结果为0,直接输出结果dl
L1: inc dl ; 先加1
    cmp ax,d1 ; 判断d3,d1是否相等
    jz L2 ; 相等则跳转L2 加1
    jmp outc ; 不相等直接输出
L2: inc dl   ; 
outc: mov ah,2 ;
     int 21h
    .exit
    end
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值