✅
三颗 🌰
上一篇文章链接: 【计算机与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汇编原理⑨】——实验报告一【题目:排除语法错误、统计数字】.
下一篇文章链接: 🚧 🚧…
⭐️ ⭐️