定义栈段,用于临时存放输入的四位字符
STACK SEGMENT
DB 8 DUP(?)
STACK ENDS
定义数据段,STR用于输出一段提示字符串
PTR用于存放二进制输出结果
TEM用于临时存放还原出的4位十进制输入数
DATASEGMENT
STR DB "PLEASE INPUT:$"
PRT DB 19 DUP(' ')
TEM DW ?
DATAENDS
代码段
CODESEGMENT
数据段地址、栈型察灶段地址、栈顶指针初始化
START: MOV AX,DATA
MOV DS,AX
MOV AX,STACK
MOV SS,AX
MOV SP,8
将STR偏移地址赋给DX
调用9号中断用于显示从DS:DX开始的字符串,遇到$结束
LEA DX,STR
MOV AH,09H
INT 21H
循环4次每次调用1号中断读取一个数字以ASCII码形式存入AL
AL-30H得实际数字,PUSH入栈
MOV CX,4
L: MOV AH,01H
INT 21H
MOV AH,0
SUB AL,30H
PUSH AX
LOOP L
循环四次,将数字依次取出,乘1、乘10、乘100、乘1000,还原成原4位十进制数存入[SI]
LEA SI,TEM
MOV WORD PTR [SI],0
MOV CX,4
MOV BX,1
L1: POP AX
MUL BX
ADD [SI],AX
MOV AX,BX
MOV BX,10
MUL BX
MOV BX,AX
LOOP L1
为PRT末尾添加卜扮$用以识别字符串结束
MOV AX,[SI]
LEA BX,PRT
ADD BX,18
MOV BYTE PTR [BX],'$'
DEC BX
除2取余,转换为ASCII码形式倒序存入PRT
MOV CX,2
L2: MOV DX,0
DIV CX
ADD DL,30H
MOV [BX],DL
DEC BX
CMP AX,0
JNE L2
添加回车换行
MOV BYTE PTR [BX],13
DEC BX
MOV BYTE PTR [BX],10
DEC BX
调用9号中断输出
LEA DX,PRT
MOV AH,09H
INT 21H
如果想看到结果需要在本行加上这句:JMP $
退出程序
MOV AH,4CH
INT 21H
CODE ENDS
END START
——没搜——————————华丽的分割线——————————
熬夜写的,希望采纳,话说我也是这学期刚学习汇编的
参考:扰灶http://hi.baidu.com/%D7%F6%B6%F8%C2%DB%B5%C0/blog/item/a5fcfaf6a09cd93e730eeca8.html
从键盘输入四位16进制数,以2进制、10进制输出
=============================================
DATA SEGMENT
STR1DB 'INPUT A HEX NUM: $'
HEX DB 5 计划输入的字符个数(含回车符)
NNN DB 0 存放实际输入的字符个数
DB 5 DUP(?)
BIN DW ? 输入数字的二进制形式的存放单元
ERR DB 0AH, 0DH, ' ERROR !'
DB 0AH, 0DH, ' I HAVE NO TIME TO PLAY WITH YOU ! $'
STR2DB 13, 10, 'BINARY IS: $'
DATAENDS
--------------------------------------------
STACK SEGMENT PARA STACK 'STACK'
DB 100 DUP(?)
STACK ENDS
--------------------------------------------
CODE SEGMENT
ASSUME CS:CODE, SS:STACK, DS:DATA
START:
MOV AX, DATA
MOV DS, AX
MOV AX, STACK
MOV SS, AX
LEA DX, STR1 'INPUT A HEX NUM'
MOV AH, 9 显示字符串
INT 21H
LEA DX, HEX
MOV AH, 10 等着输入四位HEX数
INT 21H
---------------------------------------
下面进行转换
MOV BIN, 0 先把二进制数字单元清零
LEA SI, HEX + 2取输入字符串的首地址
MOV CH, NNN取输入字符的个数,用来控制循环处理的次数
CONV:
MOV BL, [SI] 取来一个字符
CMP BL, 0DH和回车符进行比较
JZ END0 是, 即结滑悔束
CMP BL, '0'
JB ERROR 小于'0'转移
CMP BL, 'F'
JA ERROR 大于'F'转移
CMP BL, '9'
JNA A2B不大于'9', 就去变换
CMP BL, 'A'
JNB A2B不小于'缓让扮A', 就去变换
JMP ERROR 其它符号都是错误
---------------------------------------
A2B:
SUB BL, 30HASC-->BIN
CMP BL, 10
JB A2B_END
SUB BL, 07HASC-->BIN
A2B_END:
---------------------------------------
MOV BH, 0 弄成16位数
PUSH CX
MOV AX, BIN把原来的数字乘以16
MOV CX, 16
MUL CX
ADD AX, BX 加上新输入的
MOV BIN, AX存结果,这就是二进制数
INC SI
POP CX
DEC CH 处理次数减一
JNZ CONV 非零转移
---------------------------------------
DISP:
LEA DX, STR2 'BINARY IS: $'
MOV AH, 9 显示字符串
INT 21H
---------------------------------------
MOV AX, BIN取来数字
MOV CX, 16 显示16位数
DDDD:
MOV DL, '0'先计划显示0
TEST AX, 8000H 测试最高位
JZ DDD1
INC DL 非0就显示1
DDD1:
PUSH AX
MOV AH, 2 显示DL中的ASCII码
INT 21H
POP AX
SHL AX, 1 左移
LOOP DDDD CX-1,非零转移
JMP END0 16位显示完毕,转到结束
---------------------------------------
ERROR:
LEA DX, ERR
MOV AH, 09H错误信息提示
INT 21H
---------------------------------------
END0:
MOV DL, 10
MOV AH, 2 显示DL中的ASCII码
INT 21H
MOV DL, 13
MOV AH, 2 显示DL中的ASCII码
INT 21H
---------------------------------------
MOV AX, BIN取来数字
CALL DISP_AX
MOV AH, 4CH返回DOS
INT 21H
------------------------------
DISP_AX:
MOV BX, 1010进制.
MOV CX, 5 5位.
ABC:
MOV DX, 0
DIV BX
PUSH DX保存余数
LOOP ABC
MOV CX, 5 显示5位.
ASD:
POP DX
CMP DL, 10
JB A48
ADD DL, 7
A48:
ADD DL, 48
MOV AH, 2
INT 21H 输出.
LOOP ASD
RET
------------------------------
CODE ENDS
---------------------------------------
END START
=============================================
程序执行效果如下:
c:\masm510>H_BD
INPUT A HEX NUM: D4A2
BINARY IS: 1101010010100010
54434
c:\masm510>
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)