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

目录
  • 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)

相关推荐

  • 使用汇编实现字符串的大小写转换

    使用汇编编程,可以直接访问内存中的数据,对数据进行相关操作,现在需要通过汇编指令and,or对字符串数据进行大小写转换.如下例,将BaSiC转换成大写,将iNforMaTiOn转换成小写. 例子: assume cs:codesg,ds:datasg datasg segment db 'BaSiC' db 'iNforMaTiOn' datasg ends codesg segment start: mov ax,datasg mov ds,ax mov cx,5 mov bx,0 s1: m

  • 汇编语言进制转换之16进制转10进制

    使用8086汇编,输入一个16进制的数,程序把该16进制数转换为相应的10进制数输出 程序运行截图: 要实现这样一个程序,思路可以是这样的: 1.由于我们读入的键盘输入是ASCII码表示的,且输入一个字符便得到一个ASCII码,如输入ab,程序中可以得到61h和62h.现在的问题是怎么把这些输入的字符表示成一个完整的数.对于这个问题,我们可以把每次输入的字符的ASCII码先转换为对应的数,0-9之间的数,根据ASCII码表发现可以用 ASCII码减30h 得到0-9对应的十六进制数值,对于a-b

  • ARM汇编解决阶乘及大小写转换的问题

    环境以及硬件 一.硬件仿真基于 SAMSUNG's S3C44B0X 16/32-bit RISC microprocessor 芯片,仿真器为 J-LINK 二.编写指令软件为 Integrated Development Environment ,软件仿真为 ARMulate.dll 三.需要基于ARM7硬件平台的C语言启动代码,用于分配中断向量表,初始化ISR地址,初始化堆栈空间,初始化应用程序执行环境,配置存储器系统,设定时钟周期,呼叫主应用程序. 四.这里仅有关键算法代码 ARM汇编求

  • 汇编语言功能字符串大小写转换实现实例详解

    目录 问题1:将data段中的第一个字符串转换成大写,第二个字符串转换成小写 问题2:将data段中每个单词的头一个字母改成大写字母 问题3:将data段中每个单词改为大写字母 问题4:将data段中每个单词的前4个字母改为大写字母 问题5:设计一个子程序,将一个全是字母的字符串转化成大写 问题6:设计一个子程序,将一个全是字母,以0结尾的字符串,转化成大写 复杂一点的对结构化数据的版本 问题1:将data段中的第一个字符串转换成大写,第二个字符串转换成小写 分析: 如何转换成大小写 如果利用A

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

    目录 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) 注

  • 基于Java中进制的转换函数详解

    十进制转成十六进制: Integer.toHexString(int i) 十进制转成八进制 Integer.toOctalString(int i) 十进制转成二进制 Integer.toBinaryString(int i) 十六进制转成十进制 Integer.valueOf("FFFF",16).toString() 八进制转成十进制 Integer.valueOf("876",8).toString() 二进制转十进制 Integer.valueOf(&qu

  • 汇编语言系列之汇编实现简单数学运算

    目录 5.计算S=1+2×3+3×4+4×5+···+N(N+1) 5.1设计要求: 5.2设计思路: 5.3程序清单: 5.4程序运行结果及分析: 6.计算N! 6.1设计要求: 6.2设计思路: 6.3程序清单: 6.4程序运行结果及分析: 软件:emu8086 语言:汇编语言(Assembly) 注意:本文列出了两种算术运算的代码,全部代码为博主独自一人编写,会有瑕疵,谨慎使用. 5.计算S=1+2×3+3×4+4×5+···+N(N+1) 5.1设计要求: 设计程序,实现数学公式S=1+

  • 汇编语言系列之汇编实现字符串操作

    目录 7.字符串匹配设计 7.1设计要求: 7.2设计思路: 7.3程序清单: 7.4程序运行结果及分析: 8.字符串输入及显示设计 8.1设计要求: 8.2设计思路: 8.3程序清单: 8.4程序运行结果及分析: 软件:emu8086 语言:汇编语言(Assembly) 注意:本文列出了字符串匹配和字符串输入显示的代码,全部代码为博主独自一人编写,会有瑕疵,谨慎使用. 7.字符串匹配设计 7.1设计要求: 要求掌握提示信息的设置及读取键入信息的方法.设计程序,从键盘输入两个字符串进行比较,如相

  • 汇编语言实现电子闹钟思路详解

    2.1 设计思路 首先使用8255.8254.8259 三个芯片实现电子时钟的功能,让闹钟可以正常走时:其次,在时钟的基础上添加闹铃功能.整点报时功能.设置当前时间功能:完成设计. 2.2 设计方案 1. 电子时钟部分:此次设计是通过对计数器8254设定计数值对脉冲进行计数,在程序里,8254工作于计数器0,方式3.接入的CLK为1MHz,设计数初值为10000,每100次中断计数一次,产生的记数时间正好是时钟每秒走过的时间.通过对中断控制器8259设置初始化命令字初值来控制中断.程序中通过移位

  • Jetbrains系列产品重置试用思路详解

    目录 0x0. 项目背景 0x1. 如何安装 0x2. 如何使用 0x3. 如何更新 0x4. 一些说明 0x5. 开源信息 本站惯例:本文假定你知道Jetbrains家的产品.不知道可以问问搜索引擎. 如果感觉此篇教程不够详细,还没搞定的,可以移步下面这篇教程,亲测可以. 最新idea2020激活码超详细教程(设置插件仓库成功激活到2099年) 没错,jetbrains-agent这个项目停止了.市面上漫天飞的各种最新都是其他大神的魔改版本.[/斜眼] 我不是要专门写个博文来说明jetbrai

  • Python字节码与程序执行过程详解

    目录 问题: 1. 执行过程 2. 字节码 3. 源码编译 三种编译模式: 4. PyCodeObject 5. 反编译 6. pyc 问题: 我们每天都要编写一些Python程序,或者用来处理一些文本,或者是做一些系统管理工作.程序写好后,只需要敲下python命令,便可将程序启动起来并开始执行: $ python some-program.py 那么,一个文本形式的.py文件,是如何一步步转换为能够被CPU执行的机器指令的呢?此外,程序执行过程中可能会有.pyc文件生成,这些文件又有什么作用

  • java 进制转换实例详解

    java 进制转换实例详解 十进制转成十六进制: Integer.toHexString(int i) 十进制转成八进制 Integer.toOctalString(int i) 十进制转成二进制 Integer.toBinaryString(int i) 十六进制转成十进制 Integer.valueOf("FFFF",16).toString() 八进制转成十进制 Integer.valueOf("876",8).toString() 二进制转十进制 Integ

  • 深入浅出webpack教程系列_安装与基本打包用法和命令参数详解

    webpack,我想大家应该都知道或者听过,Webpack是前端一个工具,可以让各个模块进行加载,预处理,再进行打包.现代的前端开发很多环境都依赖webpack构建,比如vue官方就推荐使用webpack.废话不多说,我们赶紧开始吧. 第一步.安装webpack 新建文件夹webpack->再在webpack下面新建demo->命令行切换到demo目录,使用npm init --yes 初始化项目的package.json文件,然后执行npm install webpack --save-de

  • php源码 fsockopen获取网页内容实例详解

    PHP fsockopen函数说明: Open Internet or Unix domain socket connection(打开套接字链接) Initiates a socket connection to the resource specified by target . fsockopen() returns a file pointer which may be used together with the other file functions (such as fgets(

随机推荐