汇编语言系列之汇编实现各种码制的转换(思路详解)
软件:emu8086
语言:汇编语言(assembly)
注意:本文列出了十六进制转二进制、十进制、ascii码及大小写字母转换的代码,全部代码为博主独自一人编写,会有瑕疵,谨慎使用。
1.十六进制转换为二进制数设计
1.1设计要求:
设计转换程序,将键盘键入的四位十六进制数据转换为等值的二进制数,并在终端显示。要求:完善程序结构,设置程序错误出口。输入的不是0-f间的值,显示错误提示信息,并要求重新输入。
1.2设计思路:
依次输入四个十六进制数并依次存放到bx中,最后将bx中结果一位一位输出为二进制。
1.3程序清单:
data segment pkey db "pleas input 4 hex(0~f):$" ekey db 0dh,0ah,'it is wrong!',0dh,0ah,'pleas input 4 hex(0~f) again:','$' huiche db 0dh,0ah,'result is:',0dh,0ah,'$' numm db 5 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 [si],al rol bx,4 add bx,[si] ;将输入的数据存入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
1.4程序运行结果及分析:
存放和输出时会遇到一些小问题,本程序通过移位和加法指令实现存放,比较麻烦但可以实现,后面的程序有所改进。
图1 十六进制转换为二进制数设计结果
2.十六进制转换为十进制数设计
2.1设计要求:
设计转换程序,将键盘输入的一位十六进制数转换为等值的十进制数,并在终端显示。设计要求:完善程序结构,设置程序错误出口。输出的不是0-f间的数字,显示错误提示信息,并要求重新输入。
2.2设计思路:
输入一位十六进制数,判断是否为0~9,a~f,a~f,各自转换后输出。
2.3程序清单:
data segment pkey db 0dh,0ah,"pleas input 1 hex(0~f):$" huiche db 0dh,0ah,'result is:$' end2 db 0dh,0ah,'it is wrong',0dh,0ah,'please input 1 hex(0~f) again:','$' numm db 3 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 [si],bh mov dl,[si] mov ah,2 int 21h ;dos功能调用,高位输出 mov [si],bl mov dl,[si] mov ah,2 int 21h ;dos功能调用,低位输出 jmp state code ends end state
2.4程序运行结果及分析:
这里输出分高位和低位输出,因为是一位十六进制数的转换,如果换两位或更多就需要将程序修改到更智能化。
图2 十六进制转换为十进制数设计结果
3.十六进制转换为ascii码
3.1设计要求:
设计转换程序,将键盘键入的十六进制数据转换为对应的ascii码,并在终端显示。
3.2设计思路:
将输入数的高位左移转ascii输出,低位转ascii输出。
3.3程序清单:
data segment pkey db 0dh,0ah,"please input 1 hex(0~f):$" huiche db 0dh,0ah,'result is:$' end2 db 0dh,0ah,'it is wrong',0dh,0ah,'please input 1 hex(0~f) again:','$' numm db 3 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 [si],bh mov dl,[si] mov ah,2 int 21h ;dos功能调用,高位输出 mov [si],bl mov dl,[si] mov ah,2 int 21h ;dos功能调用,低位输出 jmp state code ends end state
3.4程序运行结果及分析:
图3 十六进制转换为ascii码设计结果
4.英文字母大小写转换设计
4.1设计要求:
英文字母大小写转换本质上是ascii码直接的转换。要求掌握大小写字母在计算机内的表示方法及转换方法。设计程序,连续将键盘输入的小写字母转换为大写字母,并在终端显示。设计要求:小写字母转换为大写字母输出,非字母或大写字母输入,不做处理直接输出。
4.2设计思路:
判断输入是否为a~z,是的话减20h输出,不是直接输出。
4.3程序清单:
data segment pkey db 0dh,0ah,"pleas input:$" result db 0dh,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
4.4程序运行结果及分析:
图4 英文字母大小写转换设计结果
上一篇: 浏览器滚动条默认样式修改
下一篇: 微信小程序中button去除默认的边框