• 汇编语言系列Ⅰ 实现各种码制的转换


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

     

  • 相关阅读:
    BZOJ 1731: [Usaco2005 dec]Layout 排队布局
    P2294 [HNOI2005]狡猾的商人
    P1993 小K的农场
    P1250 种树
    TCP/IP的排头兵――地址解析协议(ARP) (转载)
    "git rm" 和 "rm" 的区别(转载)
    Android 在eclipse中没有出现AVD的解决方法(转载)
    浅谈C++多态性(转载)
    Ubuntu搭建Eclipse+JDK+SDK的Android (转载)
    .gitignore(转载)
  • 原文地址:https://www.cnblogs.com/BoBoRing/p/10240587.html
Copyright © 2020-2023  润新知