小言_互联网的博客

[汇编]实验1.5 实现格雷码到ASCII码的转换

365人阅读  评论(0)
一、 输出ASCII码表
  1. 思路:
    将ASCII码值放在DL寄存器中,然后输出
  2. 源码:
MOV AH,02H	;	写DL中的数据到显示屏
MOV DL,01H	;	将十六进制ASCII码值放到DL
INT 21H		;	输出DL
  1. 应用
DATA SEGMENT
A	DB	'Welcome to 8086','$'
B	DB	'Please input GR code(0000~1111):$'
DATA ENDS

CODE SEGMENT
	ASSUME CS:CODE,DS DATA

START:
	MOV AX,DATA				;	初始化DS段寄存器
	MOV DS,AX
	
	MOV DX,OFFSET A				;	获得字符串A的偏移地址
	MOV AH,09H				;	显示字符串,直到遇到'$'停止(注意:DS要是段首地址,DX要是偏移地址)
	INT 21H
	
	; 实际应用在这一段 
	
	MOV AH,02H				; 	写DL中的数据到显示屏
	MOV DL,0AH				;	将换行符的ASCII码0AH放到DL中
	INT 21H					;	输出DL中的数据

	MOV DX,OFFSET B				;	获得字符串B中的偏移地址
	MOV AH,09H				;	显示字符串B,知道遇到'$'停止(注意,DS要是段首地址,DX要是偏移地址)
	INT 21H

	MOV AX,4C00H				;	程序终止
	INT 21H
	
CODE ENDS 
END START
  1. 结果
二、实现格雷码到ASCII码的转换
  1. 思路:
    格雷码的值作为下标,去GB中查表
  2. 源码:
DATA SEGMENT
A		DB	'Welcome to 8086','$'
B		DB 	'Please input GR code(0000~1111)$'
GR		DB	0,1,3,2,6,7,5,4,12,13,15,14,10,11,9,8
MSG2	DB 13,10,'The GR code is :$'
C		DB 'I'M IN NANJING NORMAL UNIVERSITY','$'
DATA ENDS

CODE SEGMENT
	ASSUME CS:CODE,DS:DATA

START:
	MOV AX,DATA			; 初始化DS
	MOV DS,AX

	MOV DX,OFFSET A		; 取字符串A的偏移地址
	MOV AH,09H			; 输出字符串A
	INT 21H

FIRST:
	MOV AH,02H			; 写DL中的数据到显示屏
	MOV DL,0AH			; 打印换行符
	INT 21H

	MOV DX,OFFSET B		; 获取字符串B的偏移地址
	MOV AH,09H			; 输出字符串B
	INT 21H

	MOV BX,0			; BX初始化,BX用来保存用户输入的格雷码
	MOV CX,4			; CX用来控制循环次数 循环次数为4 格雷码的长度
_IN:
	MOV AH,01H			; 读键盘输入到AL中并回显
	INT 21H
	
	CMP AL,13			; 判断是否是回车键(注意:这一段代码是很好的,可以让用户输入的格雷码长度小于等于4)
	JE SEARCH			; 跳

	ADD BX,BX			; 将和左移一位,相当于乘以2
	
	CMP AL,'0'			; 判断输入的字符是否是'0'
	JE _0_
	
	CMP AL,'1'			; 判断输入的字符是否是'1'
	JE _1_	
		
	JMP FIRST			; 既不是回车,结束输入,也不是0或1,返回FIRST 重新输入

_1_:
	INC BX				; AL是1,BX+1,返回上面左移一位
_0_:
	LOOP _IN:			; AL是0,BX+0,返回上面左移一位

SEARCH:
	MOV SI,0			; 初始化SI=0


; 这一步查表还不太清楚
S1:
	CMP BL,GR[SI]
	JE	DISP			; 如果成功发现,跳转DISP
	INC SI				; 如果没有成功 一个个往下找
	JMP S1	

DISP:
	MOV DL,10			; 将DL=10写入显示屏
	MOV AH,02H
	INT 21H
	MOV DL,13			; 将DL=13写入显示屏
	MOV AH,02H
	INT 21H
	
	MOV DX,OFFSET MSG2		; 获取字符串MSG2的偏移地址
	MOV AH,09H			; 打印字符串MSG2
	INT 21H

;	对SI除10取余操作
	
	MOV AX,SI
	MOV CX,0
	
; D1模块:除10取余数操作

	MOV AH,0
	MOV BL,10
	DIV BL			; DIV指令 除以字节 AL=商 AH=余数 除以字 AX=商 DX=余数
	MOV DL,AH		; 
	PUSH DX
	INC CX
	CMP AL,0
	JNE D1
	
;	压栈,压的是余数

D2:
	POP DX
	ADD DL,30H
	CMP DL,3AH
	JB D3
	ADD DL,02H

D3:
	MOV AH,02H		; 读DL寄存器中的数据到屏幕上
	INT 21H
	LOOP D2
	
	MOV AH,4CH
	INT 21H
	
CODE ENDS
  1. 结果
  2. 上面代码中等以下还不懂。
  3. 猜想,是否GB中的表格是以字节方式存储的,所以BL是二进制数据,要对二进制数据转成10进制,输出方便用户查看?
三、知识补充
  1. 格雷码有4位典型格雷码,也有八位格雷码。
  2. 用户输入的数字是ASCII码值,也可以用字符来代替。输入0,比较的是’0’字符0,输入1,比较的是’1’字符。也可以比较ASCII码值。

_IN:
	MOV AH,01H		; 读键盘输入到AL中并回显
	INT 21H

	CMP AL,13		; 判断是否是回车键(注意:这一段代码是很好的,可以让用户输入的格雷码长度小于等于4)
	JE SEARCH		; 跳
  	
  	
  	CMP AL,'0' 		; 判断输入的字符是否是'0'
 	JE _0_
 
 	CMP AL,'1'		; 判断输入的字符是否是'1'
 	JE _1_ 
  1. 第一个比较的是回车,用的是回车的ASCII码值13
  2. 第二个比较的是输入的数字,用的是0和1的字符形式,字符’0’,字符’1’。
四、总结
  1. 程序终止的两种办法
	MOV AH,4CH
	INT 21H
	MOV AX,4C00H
	INT 21H

反思:程序终止只跟高位AH有关

五、参考资料
  1. 80x86汇编语言编程:输入格雷码、输出对应的十进制数字
    https://blog.csdn.net/baidu_33836580/article/details/50578944
  2. 数字 0 - 9 转换成对应的格雷码
    https://blog.csdn.net/baidu_33836580/article/details/50578833
  3. 格雷码与二进制码的转换
    https://blog.csdn.net/hanghang121/article/details/23927465
  4. 汇编学习小记(三)-查表
    https://juejin.im/post/5adb2c57f265da0b7451bdf0
  5. 用汇编语言编写程序打印ASCII表
    https://blog.csdn.net/ljianhui/article/details/17273431
  6. 回车、换行、空格的ASCII码值—(附ASCII码表)
    https://blog.csdn.net/songjinshi/article/details/7868866

转载:https://blog.csdn.net/qq_42759370/article/details/102056408
查看评论
* 以上用户言论只代表其个人观点,不代表本网站的观点或立场