输入四位十六进制数,显示对应的十进制数(还有位对应的值,以T作为结束符).

;PROGRAM GOES HERE;13:34 2023/4/15-------17:38 2023/4/16----17:30 2023/4/17
;FOLLOWED BY DESCRIPTIVE PHRASES
;EQU STATEMENTS GO HERE 1.ds:bx指向数据区存放ascii码的首地址,ax存放转换后的二进制数,cf=1则不成功,cf=0则成功.
ST_SEG SEGMENT STACK  ;2.ax中存放要转换的十六进制数,ds:bx指向数据区中存放非压缩bcd码的末地址.
DB 1000 DUP('STACK')    ;3.把非压缩的bcd十进制码显示出来.
ST_SEG ENDS;****************
DATAREA SEGMENT          ;DEFINE CODE SEGMENT
buffer1 db 100 dup('$') ;定义bcd存放的缓冲区
buffer db  5,100 dup(?)  ;定义输入数据区,能够输入四位十六进制数,存放ascii码,根据输入的原则,先存的是高位.
changeline db 13,10,'$'
ERROR DB 'PLEASE WRITE AGAIN!',10,13,'$'
DATAREA ENDS;*****************
PROGRAM SEGMENT;-------------------
MAIN PROC FAR          ;MAIN PART OF PROGRAMASSUME CS:PROGRAM,DS:DATAREA,SS:ST_SEG;SAVE IT ON STACK,SAVE OLD DATA SEGMENT
START:MOV AX,DATAREA    ;SET DS REGISTER TO CURRENT DATA SEGMENT,DATEREA SEGMENT ADDRMOV DS,AX               ;INTO DS REGISTER;MAIN PART OF PROGRAM GOES HERE
JMP S
RETS:LEA DX,ERRORMOV AH,09HINT 21H
S:MOV AH,0AH
LEA DX,BUFFER
INT 21H
LEA DX,BUFFER
INC DX
INC DX
MOV BX,DX
;--------------------CHANGE_LINE
MOV AH,09H
LEA DX,CHANGELINE
INT 21H
;------------------------
CALL ASC_BIN  ;数据存入ax中
JC   RETS
MOV CL,4
ROR AX,CL
push ax
LEA BX,BUFFER1
CALL HEX_BCD       ;17:52 2023/4/16在这一行代码中出现了卡死的情况,忽略了跳出的情况(分支),Q的位置错误造成死循环.
LEA BX,BUFFER1
CALL DIS_DEC
LEA DX,BUFFER1
MOV AH,09H
INT 21H
lea dx,changeline
mov ah,09h
int 21h
;------------------倒序ax开始.
pop ax
mov bl,al
mov cl,4
rol bl,cl
mov bh,ah
rol bh,cl
mov al,bh
mov ah,bl
;-----------------倒序ax结束.
CMP AX,0EA60H
JB WAN5
CALL NSIX
SUB AX,0EA60H
JMP QIAN9
;-------------------
WAN5:CMP AX,0C350H
JB WAN4
CALL NFIVE
SUB AX,0C350H
JMP QIAN9
;-----------------
WAN4:CMP AX,9C40H
JB WAN3
CALL NFOUR
SUB AX,9C40H
JMP QIAN9
;------------------
WAN3:CMP AX,7530H
JB WAN2
CALL NTHREE
SUB AX,7530H
JMP QIAN9
;------------------
WAN2:CMP AX,4E20HJB WAN1
CALL NTWO
SUB AX,4E20H
JMP QIAN9
;--------------
WAN1:CMP AX,2710H
JB QIAN9
CALL NONE
SUB AX,2710H
;------------------------
QIAN9:CMP AX,2328H
JB QIAN8
CALL NNINE
SUB AX,2328H
JMP BAI9
;------------------------
QIAN8:CMP AX,1F40H
JB QIAN7
CALL NEIGHT
SUB AX,1F40H
JMP BAI9
;------------------------
QIAN7:CMP AX,1B58H
JB QIAN6CALL NSEVENSUB AX,1B58H
JMP BAI9
;------------------------
QIAN6:CMP AX,1770H
JB QIAN5CALL NSIXSUB AX,1770H
JMP BAI9
;------------------------
QIAN5:CMP AX,1388H
JB QIAN4CALL NFIVESUB AX,1388H
JMP BAI9
;------------------------
QIAN4:CMP AX,0FA0H
JB QIAN3CALL NFOURSUB AX,0FA0H
JMP BAI9
;------------------------
QIAN3:CMP AX,0BB8H
JB QIAN2CALL NTHREESUB AX,0BB8H
JMP BAI9
;------------------------
QIAN2:CMP AX,07D0H
JB QIAN1CALL NTWOSUB AX,07D0H
JMP BAI9
;------------------------
QIAN1:CMP AX,03E8H
JB QIAN0CALL NONESUB AX,03E8H
JMP BAI9
;------------------------
QIAN0:CALL NZEROBAI9:CMP AX,384H
JB BAI8CALL NNINESUB AX,384H
JMP SHI9
;------------------------!!!
BAI8:CMP AX,800
JB BAI7CALL NEIGHTSUB AX,800
JMP SHI9
;------------------------
BAI7:CMP AX,700
JB BAI6CALL NSEVENSUB AX,700
JMP SHI9
;------------------------
BAI6:CMP AX,600
JB BAI5
CALL NSIX
SUB AX,600
JMP SHI9
;------------------------
BAI5:CMP AX,500
JB BAI4CALL NFIVESUB AX,500
JMP SHI9
;------------------------?
BAI4:CMP AX,400
JB BAI3CALL NFOURSUB AX,400
JMP SHI9
;------------------------
BAI3:CMP AX,300
JB BAI2CALL NTHREESUB AX,300
JMP SHI9
;------------------------
BAI2:CMP AX,200
JB BAI1CALL NTWOSUB AX,200
JMP SHI9
;------------------------
BAI1:CMP AX,100
JB BAI0CALL NONESUB AX,100
JMP SHI9
;---------------
BAI0:CALL NZERO;------------------------
SHI9:CMP AX,90
JB SHI8CALL NNINESUB AX,90
JMP GE9
;------------------------
SHI8:CMP AX,80
JB SHI7CALL NEIGHTSUB AX,80
JMP GE9
;------------------------
SHI7:CMP AX,70
JB SHI6CALL NSEVENSUB AX,70
JMP GE9
;------------------------
SHI6:CMP AX,60
JB SHI5CALL NSIXSUB AX,60
JMP GE9
;------------------------
SHI5:CMP AX,50
JB SHI4CALL NFIVESUB AX,50
JMP GE9
;------------------------
SHI4:CMP AX,40
JB SHI3CALL NFOURSUB AX,40
JMP GE9
;------------------------
SHI3:CMP AX,30
JB SHI2
CALL NTHREE
SUB AX,30
JMP GE9
;------------------------
SHI2:CMP AX,20
JB SHI1
CALL NTWO
SUB AX,20
JMP GE9
;------------------------
SHI1:CMP AX,10
JB SHI0
CALL NONE
SUB AX,10
JMP GE9
SHI0:CALL NZERO;-----------------
GE9:CMP AX,9
JB GE8CALL NNINEJMP EXIT
;-----------
GE8:CMP AX,8
JB GE7CALL NEIGHTJMP EXIT
;-------------
GE7:CMP AX,7
JB GE6CALL NSEVENJMP EXIT
;--------------
GE6:CMP AX,6
JB GE5CALL NSIXJMP EXIT
;--------------
GE5:CMP AX,5
JB GE4CALL NFIVEJMP EXIT
;--------------
GE4:CMP AX,4
JB GE3CALL NFOURJMP EXIT
;--------------
GE3:CMP AX,3
JB GE2CALL NTHREEJMP EXIT
;--------------
GE2:CMP AX,2
JB GE1CALL NTWOJMP EXIT
;--------------
GE1:CMP AX,1
JB GE0CALL NONEJMP EXIT
;--------------
GE0:
CALL NZERO;----------------------------以下为结束部分
exit:MOV AH,4CHINT 21H
MAIN ENDP
;----------------------------------START--------------------------------SUB_PROCEDURE
ASC_BIN PROC NEAR          ;1.ds:bx指向数据区存放ascii码的首地址,ax存放转换后的二进制数,cf=1则不成功,cf=0则成功.
MOV AX,0
MOV CH,3;比较3次
ONCE_AGAIN:
MOV   DL,[BX]                             ;BX,BP,SI,DI,INDIRECT ADDRESSING
CMP DL,30H
JB JIESHU1
CMP DL,39H
JNA ACCESS1
CMP DL,41h
JB JIESHU
CMP DL,46h
JNA ACCESS2; 大写A~F转到相应输出
CMP DL,61h
JB JIESHU; 小于a重写
CMP DL,66h
JNA ACCESS3;  小写a~f转到相应输出
jieshu1:JMP JIESHU;其余全部跳转重写
;--------------
ACCESS1:SUB DL,30hMOV AL,DLMOV CL,4ROR AX,CLJMP TWO
;-------------
ACCESS2:SUB Dl,37hMOV AL,DLMOV CL,4ROR AX,CLJMP TWO
;-------------
ACCESS3:SUB Dl,57hMOV AL,DLMOV CL,4ROR AX,CL
TWO:DEC CHINC BXCMP CH,0JNE ONCE_AGAIN
MOV DL,[BX];----------------
CMP DL,30H
JB JIESHU
CMP DL,39H
JNA ACCESS_1
CMP DL,41h
JB JIESHU
CMP DL,46h
JNA ACCESS_2; 大写A~F转到相应输出
CMP DL,61h
JB JIESHU; 小于a重写
CMP DL,66h
JNA ACCESS_3;  小写a~f转到相应输出
JMP JIESHU;其余全部跳转重写
;--------------
ACCESS_1:SUB DL,30hadd AL,DLJMP TW
;-------------
ACCESS_2:SUB Dl,37hadd AL,DLJMP TW
;-------------
ACCESS_3:SUB Dl,57hadd al,dljmp tw
;----------------------------------------
tw:     CLCRETJIESHU: STCRETURN:  RET
ASC_BIN ENDP         ;-------------------第一部分完成.
HEX_BCD PROC NEAR                    ;ax中存放要转换的十六进制数,ds:bx指向数据区中存放非压缩bcd码的末地址.
MOV CH,4
Q:PUSH AXAND AL,0FHCMP AL,0ahJB SMALLJMP BIG
SMALL:MOV [BX],ALJMP NEXT
BIG:SUB AL,0AHMOV DL,ALMOV AL,01HMOV [BX],ALINC BXMOV [BX],DL
NEXT:POP AXDEC CHINC BXMOV CL,4ROR AX,CLCMP CH,0JNE   Q
RETURN_1:RET
HEX_BCD ENDP
;----------------------------------------------------------------------
DIS_DEC PROC NEAR
MOV CX,8
loop1:MOV DL,30H     ADD [BX],DLINC BX loop loop1
RET
DIS_DEC ENDP
;-------------------
NZERO PROC NEAR
PUSH AX
MOV DL,30H
MOV AH,02H
INT 21H
POP AX
RET
NZERO ENDP
;----------------------------
NONE PROC NEAR
PUSH AX
MOV DL,31H
MOV AH,02H
INT 21H
POP AX
RET
NONE ENDP
;----------------------------
NTWO PROC NEAR
PUSH AX
MOV DL,32H
MOV AH,02H
INT 21H
POP AX
RET
NTWO ENDP
;----------------------------
NTHREE PROC NEAR
PUSH AX
MOV DL,33H
MOV AH,02H
INT 21H
POP AX
RET
NTHREE ENDP
;----------------------------
NFOUR PROC NEAR
PUSH AX
MOV DL,34H
MOV AH,02H
INT 21H
POP AX
RET
NFOUR ENDP
;----------------------------
NFIVE PROC NEAR
PUSH AX
MOV DL,35H
MOV AH,02H
INT 21H
POP AX
RET
NFIVE ENDP
;----------------------------
NSIX PROC NEAR
PUSH AX
MOV DL,36H
MOV AH,02H
INT 21H
POP AX
RET
NSIX ENDP
;----------------------------
NSEVEN PROC NEAR
PUSH AX
MOV DL,37H
MOV AH,02H
INT 21H
POP AX
RET
NSEVEN ENDP
;----------------------------
NEIGHT PROC NEAR
PUSH AX
MOV DL,38H
MOV AH,02H
INT 21H
POP AX
RET
NEIGHT ENDP
;----------------------------
NNINE PROC NEAR
PUSH AX
MOV DL,39H
MOV AH,02H
INT 21H
POP AX
RET
NNINE ENDP
;----------------------------
PROGRAM ENDS ;代码段结束
END START    

结论:1ret.

2.push pop.

3.正序和倒序.

汇编--子程序设计(1)--非压缩bcd码和十进制的转换相关推荐

  1. 汇编_压缩BCD码和非压缩BCD码

    BCD码是表示十进制数的,非压缩BCD码是用8位表示的,其实只用低4位,高4位全为0. 例如,十进制数36,用非压缩BCD码表示为:0000 0011 0000 0110 ,这是两个字节. 压缩BCD ...

  2. x86汇编_ASCII和非压缩BCD码运算_AAA / AAS_笔记56

    虽然 CPU 用二进制运算,但是也可以执行 ASCII 十进制串的运算.使用后者进行运算,对用户而言既便于输入也便于在控制台窗口显示,因为不用进行二进制转换.尽管 ASCII 运算执行速度比二进制运算 ...

  3. 汇编语言实现非压缩BCD码整数除法

    汇编语言实验 非压缩BCD码整数除法 1. 流程图 Created with Raphaël 2.2.0Begin设置除数.被除数的地址指针:字节除法的次数十进制调整字节除法.存商被除数各位已除完?调 ...

  4. 【C语言】BCD码、十进制互相转换

    目录 0. 前言: 1. BCD码 2. 算法原理 3. 进制转换 3.1 两位BCD码的转换: 3.2 其他进制转换 3.3 任意进制转二进制 参考资料: 0. 前言: 记录今天用15单片机写DS1 ...

  5. 压缩BCD码和非压缩BCD码的区别

    BCD码:用四个二进制位表示一个十进制数字:最常用的是8421   BCD码:          压缩型BCD码:一个字节可存放一个两位十进制数,其中高四位存放十位数字,低四位存放个位数字.如:56的 ...

  6. 压缩BCD码转非压缩BCD码

    注:原博客账号密码丢失,故将本科期间的笔记搬运至此 DATAS SEGMENT;此处输入数据段代码buf db 32h,29h,64h,10h,89h,99h res dw ?buf_size db ...

  7. 非压缩BCD码转压缩BCD码汇编语言

    注:原博客账号密码丢失,故将本科期间的笔记搬运至此 DATAS SEGMENT;此处输入数据段代码buf dw 0302h,0908h,0705h,0102hres db ?buf_size db ? ...

  8. BCD码和十进制的转换

    BCD码(Binary-Coded Decimal‎),用4位二进制数来表示1位十进制数中的0~9这10个数码,是一种二进制的数字编码形式,用二进制编码的十进制代码.BCD码这种编码形式利用了四个位元 ...

  9. 【汇编】子程序调用实现多精度BCD码(十进制)相加

    这里写自定义目录标题 欢迎使用Markdown编辑器 新的改变 功能快捷键 合理的创建标题,有助于目录的生成 如何改变文本的样式 插入链接与图片 如何插入一段漂亮的代码片 生成一个适合你的列表 创建一 ...

最新文章

  1. 初探领域驱动设计(1)为复杂业务而生
  2. 利用UDP19端口实施DOS攻击的真实案例
  3. 计网 --- 域名服务系统:因特网的目录服务
  4. HTTP协议之HTTP的结构
  5. CC3200底板测试-烧写CC3200-LAUNCHXL
  6. Leetcode 俄罗斯套娃信封问题
  7. 一阶低通滤波器算法实现
  8. python函数chr_python函数之chr(i)
  9. 【解决方法】jdb2/sdb1-8 io使用过高
  10. linux 日志清理
  11. 向日葵,teamviewer
  12. nas神经网络架构搜索_神经建筑搜索(NAS)基础
  13. Win10官方原版ISO下载
  14. 将本地项目上传到码云
  15. object与reflect
  16. 我第一个用DirextX做的2D游戏——炮炮兵考眼力
  17. Vue和ElementUI第二天
  18. Tribler for Mac(BT资源搜索下载器)
  19. 详解:什么是NVMe?
  20. R语言分组画条形图——qplot

热门文章

  1. 【联邦学习+区块链】联邦学习与区块链
  2. QUARTZ 简单介绍
  3. CA基本常识:X.509标准
  4. 2022年3月盗取微软源代码的 APT组织 lapsus$完整资料汇总
  5. Uniqlo与Fast Retailing发出警告 46万消费者账号遭入侵
  6. VMware克隆Linux虚拟机
  7. 8家公司笔面试经历-百度-联发科-瑞晟--
  8. 从零开始之uboot、移植uboot2017.01(八、命令解析与实现)
  9. Ubuntu: AppImage格式安装、卸载
  10. 雷军带领小米老员工公园步行 称这些人是小米最宝贵财富