汇编语言系列之汇编实现各种码制的转换(思路详解)
<div id="navCategory"><h5 class="catalogue">目录</h5><ul class="first_class_ul"><li>1.十六进制转换为二进制数设计</li><ul class="second_class_ul"><li>1.1设计要求:</li><li>1.2设计思路:</li><li>1.3程序清单:</li><li>1.4程序运行结果及分析:</li></ul><li>2.十六进制转换为十进制数设计</li><ul class="second_class_ul"><li>2.1设计要求:</li><li>2.2设计思路:</li><li>2.3程序清单:</li><li>2.4程序运行结果及分析:</li></ul><li>3.十六进制转换为ASCII码</li><ul class="second_class_ul"><li>3.1设计要求:</li><li>3.2设计思路:</li><li>3.3程序清单:</li><li>3.4程序运行结果及分析:</li></ul><li>4.英文字母大小写转换设计</li><ul class="second_class_ul"><li>4.1设计要求:</li><li>4.2设计思路:</li><li>4.3程序清单:</li><li>4.4程序运行结果及分析:</li></ul></ul></div><p>软件:emu8086</p><p>语言:汇编语言(Assembly)</p>
<p>注意:本文列出了十六进制转二进制、十进制、ASCII码及大小写字母转换的代码,全部代码为博主独自一人编写,会有瑕疵,谨慎使用。</p>
<p class="maodian"></p><h2>1.十六进制转换为二进制数设计</h2>
<p class="maodian"></p><h3>1.1设计要求:</h3>
<p>设计转换程序,将键盘键入的四位十六进制数据转换为等值的二进制数,并在终端显示。要求:完善程序结构,设置程序错误出口。输入的不是0-F间的值,显示错误提示信息,并要求重新输入。</p>
<p class="maodian"></p><h3>1.2设计思路:</h3>
<p>依次输入四个十六进制数并依次存放到BX中,最后将BX中结果一位一位输出为二进制。</p>
<p style="text-align: center"><img alt="" src="https://img.jbzj.com/file_images/article/202111/2021112712321316.png" /></p>
<p class="maodian"></p><h3>1.3程序清单:</h3>
<div class="jb51code">
<pre class="brush:plain;">
DATA SEGMENT
pkey DB "pleas input 4 hex(0~F):$"
ekey DB0dh,0ah,'it is wrong!',0dh,0ah,'pleas input 4 hex(0~F) again:','$'
huicheDB0dh,0ah,'result is:',0dh,0ah,'$'
nummDB5 dup(0)
DATA ENDS
CODE SEGMENT
ASSUME CS:CODE,DS:DATA
STATE:
MOV AX,DATA
MOV DS,AX
MOV CX,4 ;输入十六进制数循环4次
LEA SI,numm ;开辟变址寄存器SI
LEA DX,pkey
MOV AH,9
INT 21H ;DOS功能调用,输出字符串
lp: MOV AH, 1
INT 21H ;DOS功能调用,输入4个十六进制数
CMP AL,'9'
JA abow9
CMP AL,'0'
JB eero
SUB AL,30h ;输入为0~9时ASCII码减30H存放
JMP lop
eero:LEA DX, ekey ;输入不在0~9且不在A~F时,显示错误
MOV AH, 9
INT 21H
JMP lp
abow9:CMP AL,'A'
JNB abowa
JMP eero
abowa:CMP AL,'F'
JA eero
SUB AL,37h ;输入为A~F时ASCII码减37H存放
JMP lop
lop: MOV ,AL
ROL BX,4
ADD BX, ;将输入的数据存入BX寄存器中
INC SI
DEC CX
JNZ lp
MOV CX,16 ;输出二进制数循环16次
LEA DX,huiche
MOV AH,9
INT 21H ;DOS功能调用,输出字符串
lp1: ROL BX,1 ;左移1位后显示的是最高位
MOV DL,BL
AND DL,01H ;屏蔽DL高7位
ADD DL,30H ;加30H对应ASCII码
MOV AH,2
INT 21H ;DOS功能调用,将内容按位输出
DEC CX
JNZ lp1
CODE ENDS
END STATE</pre>
</div>
<p class="maodian"></p><h3>1.4程序运行结果及分析:</h3>
<p>存放和输出时会遇到一些小问题,本程序通过移位和加法指令实现存放,比较麻烦但可以实现,后面的程序有所改进。</p>
<p style="text-align: center"><img alt="" src="https://img.jbzj.com/file_images/article/202111/2021112712321317.png" /></p>
<p>图1 十六进制转换为二进制数设计结果</p>
<p class="maodian"></p><h2>2.十六进制转换为十进制数设计</h2>
<p class="maodian"></p><h3>2.1设计要求:</h3>
<p>设计转换程序,将键盘输入的一位十六进制数转换为等值的十进制数,并在终端显示。设计要求:完善程序结构,设置程序错误出口。输出的不是0-F间的数字,显示错误提示信息,并要求重新输入。</p>
<p class="maodian"></p><h3>2.2设计思路:</h3>
<p>输入一位十六进制数,判断是否为0~9,a~f,A~F,各自转换后输出。</p>
<p style="text-align: center"><img alt="" src="https://img.jbzj.com/file_images/article/202111/2021112712321318.png" /></p>
<p></p>
<p class="maodian"></p><h3>2.3程序清单:</h3>
<div class="jb51code">
<pre class="brush:plain;">
DATA SEGMENT
pkeyDB0dh,0ah,"pleas input 1 hex(0~F):$"
huiche DB0dh,0ah,'result is:$'
end2DB0dh,0ah,'it is wrong',0dh,0ah,'please input 1 hex(0~F) again:','$'
numm DB3 dup(0)
DATA ENDS
CODE SEGMENT
ASSUME CS:CODE,DS:DATA
STATE:
MOV AX,DATA
MOV DS,AX
LEA SI,numm ;开辟缓冲区
LEA DX,pkey
MOV AH,9
INT 21H ;DOS功能调用,输出字符串
LP: MOV AH, 1
INT 21H ;DOS功能调用,输入1个十六进制数
CMP AL,'9'
JA abow9
CMP AL,'0'
JB eero ;输入小于0重新输入
ADD AH,2FH ;输入为0~9高位给0输出
JMP OUTPUT
abow9: CMP AL,'A'
JNB abowA
JMP eero ;输入大于9小于A重新输入
abowA:CMP AL,'F'
JA abowF
SUB AL,11H
ADD AH,30H ;输入A~F高位给1,低位减11H输出
JMP OUTPUT
abowF:CMP AL,'a'
JNB abow1a
JMP eero ;输入大于F小于a重新输入
abow1a:CMP AL,'f'
JA eero ;输入大于f重新输入
SUB AL,31H
ADD AH,30H ;输入a~f高位给1,低位减31H输出
JMP OUTPUT
eero:LEA DX,end2
MOV AH,9
INT 21H ;DOS功能调用,输出错误字符串
JMP LP
OUTPUT:
MOV BX,AX
LEA DX,huiche
MOV AH,9
INT 21H ;DOS功能调用,输出字符串
MOV ,BH
MOV DL,
MOV AH,2
INT 21H ;DOS功能调用,高位输出
MOV ,BL
MOV DL,
MOV AH,2
INT 21H ;DOS功能调用,低位输出
JMP STATE
CODE ENDS
END STATE</pre>
</div>
<p class="maodian"></p><h3>2.4程序运行结果及分析:</h3>
<p>这里输出分高位和低位输出,因为是一位十六进制数的转换,如果换两位或更多就需要将程序修改到更智能化。</p>
<p style="text-align: center"><img alt="" src="https://img.jbzj.com/file_images/article/202111/2021112712321419.png" /></p>
<p>图2 十六进制转换为十进制数设计结果</p>
<p class="maodian"></p><h2>3.十六进制转换为ASCII码</h2>
<p class="maodian"></p><h3>3.1设计要求:</h3>
<p>设计转换程序,将键盘键入的十六进制数据转换为对应的ASCII码,并在终端显示。</p>
<p class="maodian"></p><h3>3.2设计思路:</h3>
<p>将输入数的高位左移转ASCII输出,低位转ASCII输出。</p>
<p style="text-align: center"><img alt="" src="https://img.jbzj.com/file_images/article/202111/2021112712321420.png" /></p>
<p class="maodian"></p><h3>3.3程序清单:</h3>
<div class="jb51code">
<pre class="brush:plain;">
DATA SEGMENT
pkeyDB0dh,0ah,"please input 1 hex(0~F):$"
huiche DB0dh,0ah,'result is:$'
end2DB0dh,0ah,'it is wrong',0dh,0ah,'please input 1 hex(0~F) again:','$'
nummDB3 dup(0)
DATA ENDS
CODE SEGMENT
ASSUME CS:CODE,DS:DATA
STATE:
MOV AX,DATA
MOV DS,AX
LEA SI,numm ;开辟缓冲区
LEA DX,pkey
MOV AH,9
INT 21H ;DOS功能调用,输出字符串
LP: MOV AH, 1
INT 21H ;DOS功能调用,输入1个十六进制数
CMP AL,'9'
JA abow9
CMP AL,'0'
JB end1 ;输入小于0重新输入
JMP OUTPUT
abow9: CMP AL,'A'
JNB abowA
JMP end1 ;输入大于9小于A重新输入
abowA:CMP AL,'F'
JA end1 ;输入大于F重新输入
JMP OUTPUT
end1:LEA DX,end2
MOV AH,9
INT 21H ;DOS功能调用,输出错误字符串
JMP LP
OUTPUT:
MOV BX,AX
ROL BX,4
AND BH,0FH
ADD BH,30H ;高位是AX左移四位再加30H得到
AND AL,0FH
MOV BL,AL
ADD BL,30H ;低位是AL低四位加30H得到
LEA DX,huiche
MOV AH,9
INT 21H ;DOS功能调用,输出字符串
MOV ,BH
MOV DL,
MOV AH,2
INT 21H ;DOS功能调用,高位输出
MOV ,BL
MOV DL,
MOV AH,2
INT 21H ;DOS功能调用,低位输出
JMP STATE
CODE ENDS
END STATE</pre>
</div>
<p class="maodian"></p><h3>3.4程序运行结果及分析:</h3>
<p style="text-align: center"><img alt="" src="https://img.jbzj.com/file_images/article/202111/2021112712321421.png" /></p>
<p>图3 十六进制转换为ASCII码设计结果</p>
<p class="maodian"></p><h2>4.英文字母大小写转换设计</h2>
<p class="maodian"></p><h3>4.1设计要求:</h3>
<p>英文字母大小写转换本质上是ASCII码直接的转换。要求掌握大小写字母在计算机内的表示方法及转换方法。设计程序,连续将键盘输入的小写字母转换为大写字母,并在终端显示。设计要求:小写字母转换为大写字母输出,非字母或大写字母输入,不做处理直接输出。</p>
<p class="maodian"></p><h3>4.2设计思路:</h3>
<p>判断输入是否为a~z,是的话减20H输出,不是直接输出。</p>
<p style="text-align: center"><img alt="" src="https://img.jbzj.com/file_images/article/202111/2021112712321422.png" /></p>
<p class="maodian"></p><h3>4.3程序清单:</h3>
<div class="jb51code">
<pre class="brush:plain;">
DATA SEGMENT
pkey DB0dh,0ah,"pleas input:$"
result DB0dh,0ah,'result is:','$'
DATA ENDS
CODE SEGMENT
ASSUME CS:CODE,DS:DATA
STATE:
MOV AX,DATA
MOV DS,AX ;初始化数据段
LP: LEA DX,pkey
MOV AH,9
INT 21H ;DOS功能调用,输出字符串
MOV AH, 1
INT 21H ;DOS功能调用,键盘输入
CMP AL,'z'
JA LLP
CMP AL,'a' ;输入不在a~z之间直接输出
JB LLP
SUB AL,20H ;输入为a~z转换,ASCII码减20H
MOV BL,AL
OUTPUT:
LEA DX,result
MOV AH,9
INT 21H ;DOS功能调用,输出字符串
MOV DL,BL
MOV AH,2
INT 21H ;DOS功能调用,输出DL中内容
JMP LP
LLP: MOV BL,AL
JMP OUTPUT
CODE ENDS
END STATE</pre>
</div>
<p class="maodian"></p><h3>4.4程序运行结果及分析:</h3>
<p style="text-align: center"><img alt="" src="https://img.jbzj.com/file_images/article/202111/2021112712321523.png" /></p>
<p>图4 英文字母大小写转换设计结果</p>
<div class="art_xg">
<b>您可能感兴趣的文章:</b><ul><li>汇编语言系列之汇编实现字符串操作</li><li>汇编语言系列之汇编实现简单数学运算</li><li>汇编语言Debug命令详解教程</li><li>汇编语言LDR指令和LDR伪指令详解</li></ul>
</div>
</div>
<!--endmain-->
頁:
[1]