虽然 CPU 用二进制运算,但是也可以执行 ASCII 十进制串的运算。使用后者进行运算,对用户而言既便于输入也便于在控制台窗口显示,因为不用进行二进制转换。尽管 ASCII 运算执行速度比二进制运算要慢很多,但是它有两个明显的优点:1) 不必在执行运算之前转换串格式。2) 使用假设的十进制小数点,使得实数操作不会出现浮点运算的舍入误差的危险。有四类指令用于处理 ASCII 加法、减法、乘法和除法:AAA / AAS / AAM / AAD

AAA:ASCII adjust after addition。

执行加法后进行 ASCII 调整。将AX寄存器的内容转换为BCD码,但是这个内容是有条件的,必须先将AH设置0,然后AL的内容是由两个ASCII码的数字相加后的结果。如果AL存放其它不符合要求的内容,AAA指令的结果将没有意义。AAA指令的算法用C语言表达如下:

if ((and al, 0Fh) > 9 || AC == 1){if (8088 || 8086){al = al + 6else ax = ax + 6}ah = ah + 1AC = 1 CY = 1
elseAC = 0CY = 0
}
al = (and al, 0Fh)

下例展示了如何用 AAA 指令正确地实现 ASCII 数字 8 加 2。在执行加法之前,必须把 AH 清零,否则它将影响 AAA 执行的结果。最后一条指令将 AH 和 AL 转换为 ASCII 数字:

mov ah, 0
mov al, '8'                     ; AX = 0038h
add al, '2'                     ; AX = 006Ah
aaa                             ; AX = 0100h (结果进行 ASCII 调整)
or ax, 3030h                    ; AX = 3130h ='10' (转换为 ASCH 码)

使用AAA指令处理很长的ASCII码阿拉伯数字相加的例子,100123456789765 + 900402076502015。这里的难点是,虽然AAA指令能轻松地将两个ASCII的数字相加,但相加的结果可能会进位,下一位的数字相加时不要忘记把前面的进位一起算进去。

.386
.model flat, stdcall
.stack 4096
ExitProcess proto,dwExitCode:dword
INCLUDE Irvine32.inc.data
decimal_one BYTE "100123456789765"
decimal_two BYTE "900402076502015"
sum byte 15 dup(0), 0.code
main PROCnopmov esi, offset decimal_one + 14mov edi, offset decimal_two + 14mov ebp, offset sum + 15mov ecx, 15mov bh, 0L1:mov ah, 0mov al, [esi]add al, [edi]AAAadd al, bhAAAor ax, 3030hmov [ebp], almov bh, ahdec ebpdec esidec ediloop L1mov [ebp], bhnopinvoke ExitProcess,0
main ENDPend main

AAS (ASCII adjust after subtraction)

32 位模式下,AAS(做完减法后调整为ASCII码)指令紧随 SUB 或 SBB 指令之后,这两条指令执行两个非压缩BCD码的减法,并将结果保存到 AL 中。AAS 指令将 AL 转换为 ASCII 码的数字形式。

.386
.model flat, stdcall
.stack 4096
ExitProcess proto,dwExitCode:dword
INCLUDE Irvine32.inc.data.code
main PROCnopmov eax, 0mov al, '8'mov bl, '5'sub al, blAASinvoke ExitProcess,0
main ENDPend main

x86汇编_ASCII和非压缩BCD码运算_AAA / AAS_笔记56相关推荐

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

    输入四位十六进制数,显示对应的十进制数(还有位对应的值,以T作为结束符). ;PROGRAM GOES HERE;13:34 2023/4/15-------17:38 2023/4/16----17 ...

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

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

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

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

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

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

  5. 压缩BCD码转非压缩BCD码

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

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

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

  7. [计组]压缩BCD码指二进制编码的十进制

    压缩BCD码指二进制编码的十进制 压缩BCD码指一个字节8位存储2位BCD码.比如32用8421BCD码表示如下:非压缩BCD码表示:00000011 00000010:压缩BCD码表示:0011 0 ...

  8. BCD码和压缩BCD码

    BCD码    BCD码,全称二进制编码的十进制.用4位二进制数来表示1位十进制数中的0-9这10个数码.    BCD码可分为有权码和无权码两类: 有权BCD码有8421码.2421码.5421码, ...

  9. 压缩BCD码拆成两个ACSII码存入指定单元【汇编语言】

    将片内RAM的20H单元中的压缩BCD码拆成两个ACSII码存入21H.22H单元.低4位存在21H单元,高4位存在22H单元. 思路: 压缩BCD码和非压缩BCD码的区别 一个BCD码占4位,而一个 ...

最新文章

  1. 无限的Bash历史[关闭]
  2. 每天5分钟玩转容器技术 ---- 系列文章
  3. Spring JDBC-使用注解配置声明式事务
  4. CCS中给工程加入C66x CSL库和头文件
  5. YL杯超级篮球赛(jzoj 1325)
  6. 如何阻止表单的默认提交事件
  7. TwentyEleven暗色系主题实现透明
  8. R语言-数据整形之简介
  9. 使用LDAP查询快速提升域权限
  10. 游戏筑基开发之广度优先搜索算法(C语言)
  11. oa导入表格html,oa系统表单模板导入操作过程
  12. mysql 1032 1062_mysql slave频繁报1032_1062错误
  13. windows环境系安装flask框架,pyth3.x版本
  14. 吃鸡空投掉落射线检测,粒子系统产生红色信号烟
  15. 软考中级软件设计笔记
  16. phobos 调试 javascript
  17. php数组和链表的区别,什么是链表?链表与数组的区别?
  18. 数字电路74161(MN)
  19. 直播观看指南|SOFA 五周年,Live Long and Prosper!
  20. 如何在日志中查找mysql日志临时密码_通过查询日志定位持有锁的SQL语句

热门文章

  1. [适合非python新手]selenium自动化测试 4-浏览器插件
  2. 优联智能灯控系统升级:NB-IoT将引领智慧照明新风潮
  3. iOS账号续费前“未能验证证件”
  4. 信息学奥赛一本通:2031:【例4.17】四位完全平方数
  5. 【学术相关】基金申请全盘攻略,看过的人都能中!
  6. 你好,放大器——输入失调电压(Offset Voltage,Vos)
  7. OBS直播弹幕效果主播教程
  8. Linux 解决 bash ./ 没有那个文件或目录 的方法
  9. 自动化办公 04pdf自动化
  10. springboot全局配置文件可设置的属性