x86汇编_ASCII和非压缩BCD码运算_AAA / AAS_笔记56
虽然 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)--非压缩bcd码和十进制的转换
输入四位十六进制数,显示对应的十进制数(还有位对应的值,以T作为结束符). ;PROGRAM GOES HERE;13:34 2023/4/15-------17:38 2023/4/16----17 ...
- 汇编_压缩BCD码和非压缩BCD码
BCD码是表示十进制数的,非压缩BCD码是用8位表示的,其实只用低4位,高4位全为0. 例如,十进制数36,用非压缩BCD码表示为:0000 0011 0000 0110 ,这是两个字节. 压缩BCD ...
- 汇编语言实现非压缩BCD码整数除法
汇编语言实验 非压缩BCD码整数除法 1. 流程图 Created with Raphaël 2.2.0Begin设置除数.被除数的地址指针:字节除法的次数十进制调整字节除法.存商被除数各位已除完?调 ...
- 压缩BCD码和非压缩BCD码的区别
BCD码:用四个二进制位表示一个十进制数字:最常用的是8421 BCD码: 压缩型BCD码:一个字节可存放一个两位十进制数,其中高四位存放十位数字,低四位存放个位数字.如:56的 ...
- 压缩BCD码转非压缩BCD码
注:原博客账号密码丢失,故将本科期间的笔记搬运至此 DATAS SEGMENT;此处输入数据段代码buf db 32h,29h,64h,10h,89h,99h res dw ?buf_size db ...
- 非压缩BCD码转压缩BCD码汇编语言
注:原博客账号密码丢失,故将本科期间的笔记搬运至此 DATAS SEGMENT;此处输入数据段代码buf dw 0302h,0908h,0705h,0102hres db ?buf_size db ? ...
- [计组]压缩BCD码指二进制编码的十进制
压缩BCD码指二进制编码的十进制 压缩BCD码指一个字节8位存储2位BCD码.比如32用8421BCD码表示如下:非压缩BCD码表示:00000011 00000010:压缩BCD码表示:0011 0 ...
- BCD码和压缩BCD码
BCD码 BCD码,全称二进制编码的十进制.用4位二进制数来表示1位十进制数中的0-9这10个数码. BCD码可分为有权码和无权码两类: 有权BCD码有8421码.2421码.5421码, ...
- 压缩BCD码拆成两个ACSII码存入指定单元【汇编语言】
将片内RAM的20H单元中的压缩BCD码拆成两个ACSII码存入21H.22H单元.低4位存在21H单元,高4位存在22H单元. 思路: 压缩BCD码和非压缩BCD码的区别 一个BCD码占4位,而一个 ...
最新文章
- 无限的Bash历史[关闭]
- 每天5分钟玩转容器技术 ---- 系列文章
- Spring JDBC-使用注解配置声明式事务
- CCS中给工程加入C66x CSL库和头文件
- YL杯超级篮球赛(jzoj 1325)
- 如何阻止表单的默认提交事件
- TwentyEleven暗色系主题实现透明
- R语言-数据整形之简介
- 使用LDAP查询快速提升域权限
- 游戏筑基开发之广度优先搜索算法(C语言)
- oa导入表格html,oa系统表单模板导入操作过程
- mysql 1032 1062_mysql slave频繁报1032_1062错误
- windows环境系安装flask框架,pyth3.x版本
- 吃鸡空投掉落射线检测,粒子系统产生红色信号烟
- 软考中级软件设计笔记
- phobos 调试 javascript
- php数组和链表的区别,什么是链表?链表与数组的区别?
- 数字电路74161(MN)
- 直播观看指南|SOFA 五周年,Live Long and Prosper!
- 如何在日志中查找mysql日志临时密码_通过查询日志定位持有锁的SQL语句
热门文章
- [适合非python新手]selenium自动化测试 4-浏览器插件
- 优联智能灯控系统升级:NB-IoT将引领智慧照明新风潮
- iOS账号续费前“未能验证证件”
- 信息学奥赛一本通:2031:【例4.17】四位完全平方数
- 【学术相关】基金申请全盘攻略,看过的人都能中!
- 你好,放大器——输入失调电压(Offset Voltage,Vos)
- OBS直播弹幕效果主播教程
- Linux 解决 bash ./ 没有那个文件或目录 的方法
- 自动化办公 04pdf自动化
- springboot全局配置文件可设置的属性