汇编语言:从键盘上接收一个四位数的十进制数,并在终端上显示出与它等值的二进制数。

汇编语言:从键盘上接收一个四位数的十进制数,并在终端上显示出与它等值的二进制数。,第1张

ASSUME CS:CODE,DS:DATA,SS:STACK

定义栈段,用于临时存放输入的四位字符

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>


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/12558181.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-26
下一篇 2023-05-26

发表评论

登录后才能评论

评论列表(0条)

保存