还是汇编语言程序的题,大家帮帮忙!!!!

试编写一个汇编语言程序,要求从键盘接收三个16进制数,并根据对三个数的比较显示出如下信息:(1):如果三个数都不相等则显示0(2):如果三个数有两个数相等则显示1(3):... 试编写一个汇编语言程序,要求从键盘接收三个16进制数,并根据对三个数的比较显示出如下信息:
(1):如果三个数都不相等则显示0
(2):如果三个数有两个数相等则显示1
(3):如果三个数都相等则显示2
1楼的朋友,老师布置作业的时候没有说多少位,那就弄点简单的吧,8位或16位的都可以
展开
 我来答
汤旺河边
2009-11-12 · TA获得超过2.9万个赞
知道大有可为答主
回答量:2675
采纳率:0%
帮助的人:2923万
展开全部
; 本程序在MASMPlus 1.2集成环境下通过编译,经过调试,运行正确。
Code Segment
Assume CS:Code,DS:Code
CR equ 000DH
LF equ 000AH
KBBack equ 0008H
; -------------------------------------
; 功能:显示指定地址(Str_Addr)的字符串
; 入口:
; Str_Addr=字符串地址(要求在数据段)
; 用法: Output Str_Addr
; 用法举例:Output PromptStr
Output MACRO Str_Addr
lea dx,Str_Addr
mov ah,9
int 21h
EndM
; -------------------------------------
; 功能:输出一个字符
; 入口:dl=要显示的字符
Output_Chr proc Near
push ax
mov ah,02h
int 21h
pop ax
ret
Output_Chr endp
; -------------------------------------
; 功能:输出回车换行
Output_CTLF proc Near
push ax
push dx
mov ah,02h
mov dl,0dh
int 21h
mov dl,0ah
int 21h
pop dx
pop ax
ret
Output_CTLF endp
; -------------------------------------
; 功能:取光标位置
; 入口:无
; 出口:DH=行号,DL=列号
GetCursor Proc Near
PUSH AX
PUSH BX
PUSH CX
PUSH DX
XOR BX,BX
MOV AH,3
INT 10H
MOV Cursor_Row,DH
MOV Cursor_Col,DL
POP DX
POP CX
POP BX
POP AX
RET
Cursor_Row DB ?
Cursor_Col DB ?
GetCursor EndP
; -------------------------------------
; 功能:置光标位置
; 入口:Cursor_Row=行坐标; Cursor_Col: 列坐标)
SetCursor Proc Near
PUSH DX
PUSH CX
PUSH BX
PUSH AX
MOV DH,Cursor_Row
MOV DL,Cursor_Col
XOR BX,BX
MOV AH,2
INT 10H
POP AX
POP BX
POP CX
POP DX
RET
SetCursor EndP
; -------------------------------------
; 功能:键盘输入一个指定位数的十六进制数字,将其转换成二进制数
; 由于限定最大数据类型为字,所以,十六进制数字位数最多4位,最大无符号数:0FFFFH
; 约定:直接回车,视为数字0
; 入口:@@Hexadec=数字位数
; 出口:转换后的二进制数保存在AX寄存器中
Input_Hex Proc Near
push cx
push bx
mov cx,cs:@@Hexadec ;十六进制数位数
xor bx,bx ;十六进制数初值
@@Input_Hex: call GetCursor ;取光标位置
mov ah,1 ;从键盘接受一个字符
int 21h
cmp al,CR ;回车?已经键入的十六进制字符不足N位
jz @@Return_Hex
cmp al,KBBack ;回空键?
jz @@KB_Back ;是,重新输入
cmp al,'0' ;低于数字'0'?
jb @@KBBack ;是,重新输入
cmp al,'9';低于或等于数字'9'?
jbe @@Convert_Bin ;是,转去转换成二进制数
and al,0dfh ;对高于数字'9'的字符视为字母并转换成大写,以便判断是否是A~F之间的字母
cmp al,'A' ;低于字母'A'?
jb @@KBBack ;是,重新输入
cmp al,'F' ;高于字母'F'?
jbe @@Convert_Bin ;是,转去转换成二进制数
jmp @@KBBack ;高于字母'F',重新输入
@@KB_Back: dec Cursor_Col
inc cx
@@KBBack: call SetCursor ;置光标位置
jmp @@Input_Hex
@@Convert_Bin: and al,0fh ;转换成二进制数
push cx
mov cx,4
shl bx,cl ;前面的数左移4位,实现乘16
or bl,al ;加上刚输入的数
pop cx
loop @@Input_Hex ;接受下一个数字
@@Return_Hex: mov ax,bx
pop bx
pop cx
ret
@@Hexadec dw ? ;数字位数
Input_Hex EndP
; -------------------------------------
Hex_Number dw 3 dup(?) ;
Prompt_Hex db 'Please input 4 bits hexadecimal number: $'
Temp_Cursor dw ? ;保存光标位置
Press_Key db 7,13,10,13,10,'The complated. Press any key to exit...$'
Start: push cs
pop ds
push cs
pop es
Output Prompt_Hex ;提示输入4位十六进制数
lea di,Hex_Number ;十六进制数存放地址
mov cs:@@Hexadec,4 ;十六进制数位数
mov cx,3
cld
Input_Data: call GetCursor ;取光标位置
mov ax,WORD PTR Cursor_Row
mov Temp_Cursor,ax ;保存光标位置
call Input_Hex ;键盘输入一个指定位数的十六进制数字,将其转换成二进制数
stosw ;保存
cmp cx,1 ;最后一个数?
jz @@Continue ;是,跳过显示逗号
mov ax,Temp_Cursor ;取光标位置
add ah,4 ;列号加4
mov WORD PTR Cursor_Row,ax
call SetCursor ;置光标位置
mov dl,','
call Output_Chr ;显示一个字符
@@Continue: loop Input_Data ;下一个十六进制数
call Output_CTLF ;输出一个回车、换行
mov ax,Hex_Number ;读入第一个数
mov dl,'0' ;假设三个数都不相等
cmp ax,Hex_Number[2] ;等于第二个数?
jnz Next_One ;不等,转去判断是否等于第三个数
inc dl ;相等,增值
mov ax,Hex_Number[2] ;读入第二个数
Next_One: cmp ax,Hex_Number[4] ;等于第三个数?
jnz $+4 ;不等,显示字符
inc dl ;相等,增值
call Output_Chr ;显示一个字符
; -------------------------------------
Exit_Proc: Output Press_Key ;提示操作完成,按任意键结束程序
mov ah,1
int 21h
mov ah,4ch ;结束程序
int 21h
Code ENDS
END Start ;编译到此结束
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式