【计算机与UNIX汇编原理⑩】——汇编语言程序设计举例【三种进制转换】




三颗 🌰

上一篇文章链接: 【计算机与UNIX汇编原理⑨】——实验报告一【题目:排除语法错误、统计数字】.
下一篇文章链接: 🚧 🚧…


一、例题1:二进制数显示程序

  ● 题目描述:键盘输入一位 16 进制数(0~F),显示其对应二进数显示的格式要求如右 → “00001010B”。

  ● 思路
    ① 键盘缓冲区中是键入字符的 ASCII 码。
    ② 0~9 的 ASCII 码为 30H~39H ,A~F 的 ASCII 码为 41H~46H。
    ③ 二进制数每一位数码的判断可用 RCL指令 或者 ROL指令 或者 SAL指令。

  ● 程序框图

在这里插入图片描述
  ● 代码如下

.586
DATA SEGMENT USE16
MESG 	DB 'Please Enter !', 0DH, 0AH, '$'
DATA ENDS

CODE SEGMENT USE16
ASSUME 	CS:CODE, DS:DATA
BEG: 	MOV AX, DATA
		MOV DS, AX
		MOV AH, 9 		; 显示操作提示
		MOV DX, OFFSET MESG
		INT 21H 
		
		MOV AH, 1 		; 调用功能号 01H(输入一个字符, 有回显)
		INT 21H 
		
		CMP AL, 3AH		
		JC NEXT1 		; 小于 'A' 的话就跳转
		SUB AL, 7H 

NEXT1: 	SUB AL, 30H
		MOV BL, AL 
		
		MOV AH, 2		; 调用功能号 02H(显示一个字符)
		MOV DL, '='
		INT 21H 		; 显示“=”
		CALL DISP 		; 调用二进制显示()程序
		
		MOV AH, 2		
		MOV DL, 'B'
		INT 21H 		; 显示“B”
		
EXIT: 	MOV AH, 4CH
		INT 21H

;------------子程序---------------------
DISP 	PROC 			; 显示 BL 中的二进制数(8)
		MOV CX, 8
		
LAST: 	MOV DL, '0'
		RCL BL, 1
		JNC NEXT
		MOV DL, '1'
		
NEXT: 	MOV AH, 2
		INT 21H
		LOOP LAST
		RET
DISP ENDP

CODE ENDS
END BEG

  ● 运行结果:【我输入的十六进制的 ‘D’】

在这里插入图片描述



二、例题2:十六进制数显示程序

  ● 题目描述:将 BUF 单元中的二进制数转换成十六进制数并送屏幕显示。

在这里插入图片描述

  ● 代码如下

.586
DATA SEGMENT USE16
BUF 	DW 987AH
DATA ENDS

CODE SEGMENT USE16
ASSUME 	CS:CODE, DS:DATA
BEG: 	MOV AX, DATA
		MOV DS, AX
		MOV DX, BUF
		MOV CX, 4			; 循环次数
		SAL EDX, 16			; 算术左移 16(把数据移到 EDX 的高 16)
		
AGA: 	ROL EDX, 4			; 不含进位的循环左移 4 位
		AND DL, 0FH 		; 截取低 4 位二进制数("且"运算)
		CMP DL, 10
		JC 	NEXT			; 小于 10 的时候跳转(就不用加 7 )
		ADD DL, 7
		
NEXT: 	ADD DL, 30H
		MOV AH, 2 
		INT 21H 			;显示字符
		
		LOOP AGA
		MOV AH, 4CH
		INT 21H
CODE ENDS
END BEG

  ● 中间运行过程

在这里插入图片描述

  ● 运行结果和传入的 BUF 变量一样,也是 “987A”。【可别小看这个输出功能】



三、例题3:十进制数显示程序

  ● 题目描述:用 “比较法” 进行 8 位二进制数 → 十进制数。

  ● 比较法:8 位二进制数最大为 11111111,等值的十进制数为 255。因此,比较法的关键是——判断某二进制数(假设为 BEN 单元的内容)包含几个100,几个10,几个1。

  ● 程序框图

在这里插入图片描述

  ● 代码如下

.586
CMPDISP MACRO NN				; 有参数的宏指令
LOCAL LAST, NEXT
		MOV DL, 0 				; DL清零
LAST: 	CMP BEN, NN 
		JC 	NEXT 				; BEN < NN 时转
		INC DL 					; DL加1
		SUB BEN, NN 			; BEN - NN → BEN
		JMP LAST
NEXT: 	ADD DL, 30H 			; 转换为ASCII码
ENDM

DATA SEGMENT USE16
	BEN DW 1234H 				; 4660
	TAB DW 10000, 1000, 100, 10, 1
	COUNT EQU ($-TAB)/2			; 因为 TAB 是字属性, 所以要除半
	BUF DB COUNT DUP(?), '$' 	; 输出缓冲区
DATA ENDS

CODE SEGMENT USE16
ASSUME 	CS:CODE, DS:DATA
BEG: 	MOV AX, DATA
		MOV DS, AX
		MOV CX, COUNT 			
		MOV BX, OFFSET TAB
		MOV SI, OFFSET BUF
		
AGA: 	MOV AX, [BX] 
		CMPDISP AX 				; 调用宏得到 ASCII 码
		MOV [SI], DL 			; 将 ASCII 码保存到输出缓冲区中
		ADD BX, 2				; 位置+2字节
		INC SI 					; ()16位通用寄存器
		LOOP AGA
		
		MOV SI, OFFSET BUF 		; 输出缓冲区地址重新 → SI(准备输出)
NOSP: 	CMP BYTE PTR [SI], 30H 	; 判断字符是否为‘0’(因为前缀零不用输出)
		JNZ DISP 				; 不等,跳转到 DISP 显示
		INC SI 
		JMP NOSP
		
DISP: 	MOV AH, 9 				; 显示字符串(十进制数)
		MOV DX, SI
		INT 21H 
		
		MOV AH, 4CH
		INT 21H
		
CODE ENDS
END BEG

  ● 运行结果
在这里插入图片描述



四、参考附录

[1] 《微型计算机原理与接口技术(慕课板)》
清华大学出版社

[2] 《汇编语言程序设计(第2版)》

[3] 《ASCII码一览表,ASCII码对照表》
链接: http://c.biancheng.net/c/ascii/.

上一篇文章链接: 【计算机与UNIX汇编原理⑨】——实验报告一【题目:排除语法错误、统计数字】.

下一篇文章链接: 🚧 🚧…


⭐️ ⭐️

  • 0
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

一支王同学

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值