汇编语言系列之汇编实现各种码制的转换(思路详解)

目录
  • 1.十六进制转换为二进制数设计
    • 1.1设计要求:
    • 1.2设计思路:
    • 1.4程序运行结果及分析:
  • 2.十六进制转换为十进制数设计
    • 2.1设计要求:
    • 2.2设计思路:
    • 2.3程序清单:
    • 2.4程序运行结果及分析:
  • 3.十六进制转换为ascii码
    • 3.1设计要求:
    • 3.2设计思路:
    • 3.3程序清单:
    • 3.4程序运行结果及分析:
  • 4.英文字母大小写转换设计
    • 4.1设计要求:
    • 4.2设计思路:
    • 4.3程序清单:
    • 4.4程序运行结果及分析:

软件: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 英文字母大小写转换设计结果

(0)
上一篇 2022年3月21日
下一篇 2022年3月21日

相关推荐