汇编语言:十进制数转二进制

设计完整的8086汇编源程序,其功能是通过键盘把多位的十进制转换为二进制数,并通过显示器显示出来。

         题目分析:

本汇编源程序包括以下模块:

         ⑴利用计算机系统调用功能实现数据输入,并把输入的ASCⅡ码转换为扩展的BCD码;

         ⑵设计一个算法,把多位的BCD码转换为多位的二进制数;

         ⑶利用计算机系统调用功能实现数据输出,把二进制数转换为ASCⅡ码显示出来。

         程序设计如下变量:

ASCⅡ码数组X_ASCⅡ码,用于存放输入的ASCⅡ码串;

BCD码数组X_BCD,用于存放转换的BCD码串;

二进制数数组Y_HEX,用于存放多位二进制数,变量定义如下:

DATA         SEGMENT

         BUFFER    DB    32                                 ;允许输入字符数目为32

         CHAR_L    DB    0                                   ;实际输入字符串的长度

         X_ASC       DB    32 DUP(0)                  ;定义ASCⅡ码串

         X_BCD      DB    32 DUP(0)                  ;定义BCD码串

<
### 汇编语言实现十进制十六进制方法 在汇编语言中,将十进制数换为十六进制数的过程通常分为以下几个部分:读取十进制数、将其存储为二进制形式、再将该二进制数据按照四位一组拆分并映射到十六进制字符。以下是具体的实现方式: #### 1. **读取十进制数** 通过键盘输入的方式获取用户的十进制数字,并逐步累加至寄存器中。每次输入新字符时,先将之前的值乘以10再加上当前输入的数字。 ```assembly DEC2BIN PROC NEAR MOV BX, 0 ; 初始化BX寄存器清零 KEYIN: MOV AH, 1 ; DOS调用功能号设置为1 (单字符输入) INT 21H ; 调用DOS中断服务 SUB AL, '0' ; 将ASCII码换为实际数值 JL EXIT ; 如果小于‘0’则退出 CMP AL, 9 ; 判断是否超过9 JG EXIT ; 若大于9也退出 CBW ; 字节扩展为字 XCHG AX, BX ; 交换AX和BX的内容以便计算 MOV CX, 10 ; 设置基数为10 MUL CX ; 当前值 * 10 XCHG AX, BX ; 再次交换回来 ADD BX, AX ; 加上新的数字 JMP KEYIN ; 继续循环直到完成输入 EXIT: RET ; 返回上级程序控制权 DEC2BIN ENDP ``` 此段代码实现了从标准输入流接收一系列十进制数字并将它们累积成一个完整的整数值[^3]。 #### 2. **将二进制换为十六进制字符串** 一旦获得了代表整个十进制数二进制值(位于`BX`),就需要逐位提取其组成成分并通过查表法找到相应的十六进制字母或数字表示。 ```assembly BIN2HEX PROC NEAR MOV CH, 4 ; 循环次数初始化为4(每组4bit对应一位Hex) ROTATE: MOV CL, 4 ; 移动位置设定为4 bits ROL BX, CL ; 左移BX使得最高有效半字节移动到最低端 MOV AL, BL ; 复制BL到AL做进一步处理 AND AL, 0FH ; 取得最后四个bits作为单独单元 ADD AL, '0' ; 增加偏移量使其成为ASCII编码下的相应字符 CMP AL, '9' ; 验证是否超出数字范围进入字母区域 JL PRINT ADD AL, ('A'-('9'+1)) ; 对应于大写字母A-F调整差额 PRINT: MOV DL, AL ; 准备打印出来的字符放入DL准备输出 MOV AH, 2 ; 设定AH=2 表明即将执行的是写屏幕命令 INT 21H ; 执行INT指令触发操作系统响应 DEC CH ; 计数减一 JNZ ROTATE ; 如果计数未归零继续下一轮迭代 RET ; 结束过程返回主流程 BIN2HEX ENDP ``` 以上代码片段展示了如何将存储在一个通用寄存器内的任意长度正整型变量分解开来逐一呈现为其等价的十六进制表现形式[^3]。 ### 完整示例 下面给出了一套完整的解决方案框架供参考学习之用: ```assembly assume cs:code,ds:data data segment str1 db 0Ah,"Input decimal number:",'$' str2 db 0Ah,"hexadecimal number:",'$' data ends code segment start: mov ax,data mov ds,ax main: call readchar ; 调用子函数readchar来获得用户输入的数据 call convert ; 换成十六进制后输出 mov ah,4Ch ; 正常终止应用程序 int 21h ; 子函数定义区... readchar proc near ... convert proc near ... code ends end start ``` 其中 `readchar` 和 `convert` 的具体逻辑已经在前面分别阐述过了。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值