汇编语言简单小程序——ASCII码转十进制数(bcd码)

来源:互联网 发布:木村拓哉 知乎 编辑:程序博客网 时间:2024/06/16 06:37

ASCII码转十进制数(bcd码)



  欢迎大家阅读我的博客,如果有错误请指正,有问题请提问,我会尽我全力改正错误回答问题。在此谢谢大家。下面开始正式内容

实验目的


(1)掌握不同进制数及编码相互转换的程序设计方法,加深对数码转换的理解。
(2)熟悉调试程序的方法。


实验内容


(1)编制程序将ASCII码表示的十进制数转换为二进制数;
(2)编制程序将十进制的ASCII码转换为BCD码;


编译环境


  • 计算机系统:win10电脑virtualbox上安装win7虚拟机
  • 软件:wave6000
  • 软件模拟器:8086/86


目录


  • ASCII码转十进制数bcd码
    • 实验目的
    • 实验内容
    • 编译环境
    • 目录
    • ASCII码转十进制数
      • 一知识点
        • 1ASCII码表 数字部分
        • 2流程图
        • 3代码解析
      • 二运行结果
        • ASCII码转十进制数
      • 三源码
    • ASCII码转bcd码
      • 一知识点
        • 1流程图
        • 2代码解析
      • 二运行结果
        • ASCII码转BCD码
      • 三源码


ASCII码转十进制数


一、知识点


(1)ASCII码表 数字部分

Bin(二进制) Oct(八进制) Dec(十进制) Hex(十六进制) 缩写/字符 解释 00110000 60 48 30 0 数字0 00110001 61 49 31 1 数字1 00110010 62 50 32 2 数字2 00110011 63 51 33 3 数字3 00110100 64 52 34 4 数字4 00110101 65 53 35 5 数字5 00110110 66 54 36 6 数字6 00110111 67 55 37 7 数字7 00111000 70 56 38 8 数字8 00111001 71 57 39 9 数字9


(2)流程图

Created with Raphaël 2.1.0准备好需要的存储器取得ASCII码将AX中的值乘上000AH读取一个ASCII码,加入AXAX减去0030HCX==0?对应的值在AX中,结束程序yesno


(3)代码解析

DATA SEGMENT NUM DB 30H,30H,30H,31H,39H DATA ENDS

  数据部分,NUM代表5位ASCII码这里分别是00019


 CODE SEGMENT      ASSUME CS:CODE,DS:DATA   START:MOV AX,DATA      MOV DS,AX

  代码段,进行数据导入


 MOV SI,OFFSET NUM;

  将NUM的位置存入SI,以便之后调用


MOV BX,000AH

  重点:将000AH赋值给BX,表示每一位数字的权重


MOV CX,0004H;

  重点:将0004H赋值给CX,记录之后循环的次数,因为输入是5个数字,所以这里循环四次。


MOV AH,00HMOV AL,[SI] 

  将SI所存地址中的数据(也就是NUM的第一个数字)存入AL(AX寄存器的第四位)


SUB AL,30H ;

  将AL中的值减30H(根据ASCII码表,0对应编码为0x30H,1对应的编码为0x31H以此类推,所以ASCII码减去0x30H就是对应的数字)


A1: IMUL BX  ;    ADD AL,[SI+01];    SUB AL,30H;    INC SI     LOOP A1;

循环部分

  1. 将AL的值乘上BX中的值(附权值)
  2. Al加上下一位ASCII码
  3. AL减去30H,与上一步合起来相当于加上下一位的值
  4. SI指向下一位
  5. 循环,注意循环的次数之前指定了,默认取CX中的值


二、运行结果


ASCII码转十进制数

ASCII码转十进制数源代码
  输入为 30H 30H 31H 31H 39H


ASCII码转十进制数寄存器信息ASCII码转十进制数执行信息
  输出为0077H 7*16+7=119 结果正确


三、源码

DATA SEGMENT NUM DB 30H,30H,30H,31H,39H DATA ENDS CODE SEGMENT      ASSUME CS:CODE,DS:DATA   START:MOV AX,DATA      MOV DS,AX      MOV SI,OFFSET NUM;      MOV BX,000AH      MOV CX,0004H;      MOV AH,00H      MOV AL,[SI]       SUB AL,30H ;   A1: IMUL BX  ;        ADD AL,[SI+01];        SUB AL,30H;        INC SI         LOOP A1;Ñ­»·       MOV [SI],AX       INT 21H      CODE ENDS      END START   


ASCII码转bcd码


一、知识点

  BCD码(Binary-Coded Decimal‎)亦称二进码十进数或二-十进制代码。用4位二进制数来表示1位十进制数中的0~9这10个数码。


(1)流程图

Created with Raphaël 2.1.0准备好需要的存储器取得ASCII码将AX中的值乘上0010H读取一个ASCII码,加入AXAX减去0030H,CX--CX==0?对应的值在AX中,结束程序yesno


(2)代码解析

MOV BX,0010H

  重点:将0010H赋值给BX,表示每一位数字的权重,这是和上面程序唯一不同的地方


二、运行结果


ASCII码转BCD码

ASCII码转BCD码源代码
  输入为 30H 30H 30H 31H 39H


ASCII码转BCD码寄存器信息ASCII码转BCD码执行信息
  输出结果为0019 结果正确


三、源码

DATA SEGMENT NUM DB 30H,30H,30H,31H,39H DATA ENDS CODE SEGMENT      ASSUME CS:CODE,DS:DATA   START:MOV AX,DATA      MOV DS,AX      MOV SI,OFFSET NUM;      MOV BX,0010H      MOV CX,0004H;      MOV AH,00H      MOV AL,[SI]       SUB AL,30H ;   A1: IMUL BX  ;        ADD AL,[SI+01];        SUB AL,30H;        INC SI         LOOP A1;       MOV [SI],AX       INT 21H      CODE ENDS      END START  
原创粉丝点击