今天看了下IA-32架构手册卷二关于十进制算术指令的相关部分,现在做一下总结:

先解释以下几个概念:

1. ASCII码十进制数: 就是十进制ASCII码的十六进制表达形式。 比如说,十进制中的数字1。在十六进制的表示就是31h。

这也就是ASCII码十进制数,即在显示的时候是十进制的。

2.非压缩型BCD码: 举例: (AL) = 03h,那么代表的就是未压缩的十进制数字3。特点是高4位必定是0,低4位取值范围是0-9。 直白的说就是用两个十六进制数字组在一起也就是16位二进制数,高4位必定为0,低4位是二进制的0-9以此来表示十进制中的0-9。

3.压缩型BCD码: 每四位表示一个十进制数字,一个字节有8位所以一个字节可以表达两个十进制数字。比如说82这个十进制数字如果用压缩型BCD码表示就是10000010。非压缩型表示是00001000 00000010。

----------------------------------------------------------------------------------------------------------------------------------

AAA指令(ASCII adjust after addition):

翻译:

调整两个非压缩BCD码值来变成一个非压缩BCD码的结果。这个指令中AL寄存器是暗藏的源操作数和目的操作数。AAA指令只有跟在ADD指令后面才有效。(用add加两个非压缩BCD码值并把结果存储在AL寄存器中),AAA指令接着便调整AL寄存器中的内容使其变成一位正确的非压缩BCD结果

如果add指令产生了十进制进位,AH寄存器加1并且CF和AF标志位置位。如果没有十进制进位,CF和AF标志清除并且AH寄存器不变。AL的4~7位(即高四位设为0)

下面那段伪码的含义就是上面那些话,只要看else部分就行

如果 (AL的低四位大于9) 或者 (辅助进位标志位是1) 那么AX就加上106h,也就相当于AH加1,AL的低四位加6,并且CF,AF设0

不然 AF = 0, CF = 0

举例:

mov ah, 0 ;先把ax高位清空
mov al, '8' ;ax = 0038h
add al, '2' ;ax = 006Ah 即38h + 32h = 6Ah
aaa ;调整成一个非压缩BCD码 变成0100h
or ax, 3030h 0100h 和3030h按位or操作成3130h

解释: 这里用两个ASCII十进制数(非压缩)相加后变成了一个ASCII码十进制数。然后AAA指令就把AX中的值转化成了两个非压缩的BCD码

AAD指令(ASCII adjust before division):

翻译:

调整两个非压缩BCD数字(最低有效数位在AL寄存器,最高有效数位在AH寄存器)以使一个除法操作产生的结果将生成一个正确的非压缩BCD码值。AAD指令只有在它在一个DIV指令之前才有效,这个除法指令用了在AX寄存器中由非压缩BCD码通过AAD指令调整好的值。

AAD指令设置AL寄存器为(AL + (10 * AH)),接着清除AH寄存器至00H。然后AX寄存器中的值就等于在AH和AL中的原始的非压缩两位数字(十进制)的等价物。
AAD指令的广义版本允许调整两个任意进制的非压缩数字,通过设置8位立即数来选择进制(例如,08h是八进制,0Ah是十进制或者0Ch是十二进制)。ADD助记符被所有编译器翻译成用来把未压缩BCD码调整成ASCII(十进制)值。为了调整数值成另外的进制,指令必须被手工编码成机器码。

这个指令在兼容模式和传统模式下按照描述的执行。它在64位模式中无效.

伪代码:

把AL复制一份到tempAL,把AH复制一份到tempAH,AL = (tempAL + (tempAH * 0Ah))注意这里计算出来是10进制

最后AH = 0

举例:

mov ax, 0307h
aad ;al = (3 * 10 + 7) ah = 0 ax=37=25h
mov bl, 5
div bl

解释:

这里实际上就是把非压缩的BCD码转化成为ASCII十进制数字,方便后面的除法操作符运算。而上面说的AAA指令是把ASCII十进制数字转变成非压缩BCD码

AAM指令(ASCII adjust after multiplication)

翻译:

调整两个非压缩BCD值(即ASCII码十进制值)的乘积来创造一对非压缩(十进制)BCD码值。对于这个指令来说AX寄存器是暗藏的源操作数和目的操作数。AAM指令只有它跟在一个MUL指令后面才有效(MUL指令用来乘两个非压缩BCD码值并储存一个字长度的结果到AX寄存器)。AAM指令接着调整AX寄存器的内容包括了两位正确的非压缩BCD码结果。
这个指令的广义版本允许调整AX寄存器的内容来创造两位非压缩任意进制的数字。这里,八位立即数被设定成选中的进制(内容同上)。AAM助记被所有汇编器翻译成调整ASCII(十进制)值。为了调整成其他进制,指令必须被手工编码成机器码
这个指令在兼容模式和传统模式下按照描述的执行。但在64位模式下无效

伪代码:

把AL的内容复制一份到tempAL,把tempAL / 0Ah 然后赋值给AH,最后把tempAL % 0Ah的值赋值给AL

举例:

mov bl, 05h
mov al, 06h
mul bl ;ax = 001Eh
aam ; ah = tempAL / 0Ah = 03h al = tempAL % 0Ah = 00h ax = 0300h

解释:

把两个非压缩的BCD码的乘积变成非压缩BCD码

AAS指令(ASCII adjust after subtraction)

翻译:

调整两个非压缩BCD码值的相减的结果来创造一个非压缩的BCD结果。AL寄存器是这个指令暗藏的源操作数和目标操作数。AAS指令只有当它跟在一个SUB指令后面才有用(两个非压缩BCD码相减并且把结果存在一个字节的AL寄存器中)。AAS指令接着调整AL寄存器中的内容包含一位非压缩的BCD码结果
如果减法生成了一个十进制进位,AH寄存器减1,并且CF和AF标志位置位。如果没有那么CF和AF标志位清除并且AH寄存器不改变。无论哪种情况,AL寄存器都要把它高四位清除。

伪代码:

条件和AAA相同就是结果加的变成减罢了

例子:

mov ah, 0
mov al, '8'
sub al, '9' ;al = 0FFh
aas ;AF = 1 -> 0FF09h

解释:

和AAA相反

DAS指令(decimal adjust after subtraction)

翻译:

调整两个压缩的BCD码值相减的结果来创造一个压缩的BCD码结果。AL寄存器是暗藏的源操作数和目的操作数。DAS指令只有跟在SUB指令后面时才有效(减去一个2位压缩BCD码值并且在AL寄存器内存储一个8位结果)。DAS指令调整AL寄存器的内容来包含一个正确的2位压缩BCD码结果。如果一个十进制借位被侦测到,CF和AF标志位也会相应地被置位。
这个指令在兼容模式和传统模式的执行如上所述。在64位模式是无效的。

伪代码:

不解释了,与DAA相反

例子:

mov bl, 48h
mov al, 85h
sub al, bl
das

解释:

如上

(完)

X32汇编AAA,AAS,AAM,AAD,DAS,DAA相关推荐

  1. BCD码指令 AAA DAA AAS DAS AAM AAD

    2019独角兽企业重金招聘Python工程师标准>>> 十进制数(BCD码)运算指令 在计算机中十进制数是用BCD码来表示的,BCD码有两类:一类叫压缩型BCD码,一类叫非压缩型BC ...

  2. 博客摘录「 BCD码指令 AAA DAA AAS DAS AAM AAD」2023年4月7日

    可见,AAS指令将影响状态标志位AF和CF,但SF.ZF.PF和OF状态标志位不确定.    例如想要进行两位十进制数的减法运算:13-4=?,可先将被减数和减数以非压缩型BCD码的形式分别存放在AH ...

  3. 汇编语言-012(扩展加法指令ADC、带借位减法指令SBB、执行加法后进行ASCII调整指令、AAS 、AAM、AAD 、DAA指令将和数转成压缩十进制格式)

    1:ADC : 扩展加法指令ADC .386 .model flat,stdcall.stack 4096 ExitProcess PROTO,dwExitCode:DWORD.code main P ...

  4. AAA与AAM指令代码实验

    1.从键盘输入2个数相加,得出结果 STACK SEGMENTSTL DB 100H DUP(?) STACK ENDS DATA SEGMENTINFOR1 DB "PLEASE Inpu ...

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

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

  6. 8086汇编语言指令总结

    根据工作需要,从基础学起,设计一台嵌入式CISC模型计算机,稍后上传. 先总结下,汇编语言指令,如下 1. MOV(传送) 指令写法:MOV  target,source 功能描述:将源操作数sour ...

  7. 微机原理 单片机笔记

    链接 十四个寄存器 寄存器和物理地址的形成 课后习题答案 一.基础知识 BCD码(Binary-Coded Decimal‎),用4位二进制数来表示1位十进制数中的0~9这10个数码,是一种二进制的数 ...

  8. 关于汇编语言学习的环境配置及使用方法

    关于汇编语言的环境配置及使用方法 从学习汇编以来,很多人在汇编语言的环境配置上出现了很多问题,在学习小组内也有人会向我要链接或环境的一些配置文件.其实在这之前,我也是通过不断地实验和搜索才发现并解决了 ...

  9. 计算机cmp代表什么意思,CMP指令

    CMP指令是由美国斯坦福大学提出的,英文名称是Chip multiprocessors,翻译成中文就是单芯片多处理器,也指多核心其思想是将大规模并行处理器中的SMP(对称多处理器)集成到同一芯片内,各 ...

最新文章

  1. bzoj2806: [Ctsc2012]Cheat
  2. K8S部署工具:KubeOperator集群部署
  3. 从一个小故事聊聊字符编码那些事
  4. 刚刚,阿里开源了一项重磅炸弹,终结程序员“中年危机”!
  5. sql几种删除语句的联系与区别
  6. 用面向对象的方法写敲门砖
  7. Oracle 关于事物的描述
  8. C 控制父、子进程的先后顺序执行
  9. 大数据职业理解_数据分析师真有那么好?其实正在面临3大职业困境
  10. 数据:以太坊2.0合约质押新增4.15万ETH
  11. ffmpeg 视频合并
  12. 基于Centos6.2 X64系统下的邮件系统(二)
  13. linux xxx is not in the sudoers file.This incident will be reported.的解决方法
  14. 外企应了解财税本地化技术(金税三期|批量开票|金税接口|自动开票等技术及理念)
  15. QQ,MSN,旺旺在线客服代码
  16. 《道德经》全文和译文
  17. java求100以内偶数和
  18. facebook 登陆失败 分享失败 原因汇总
  19. 数据文件检验坏块的利器-dbv
  20. 秋冬易感冒着凉 风寒感冒9大食疗方

热门文章

  1. 四川汶川县今天又连发生地震!
  2. 认证的公众号可以快速免费注册认证小程序
  3. 正则表达式-2021
  4. js日期格式转换Wed Mar 22 13:38:37 CST 2017 转换 为yyyy-mm-dd
  5. 微信speex音频格式转mp3
  6. html实现ipad投屏到显示器,iPad投屏的两种方式
  7. 最左推导和最右推导,语法树,二义性文法
  8. 刑侦科推理试题(不知来源,最右APP看到)
  9. PHP 面试总结(持续更新) --小丑
  10. 电脑台式计算机描述不可用,【计算机描述不可用】计算机描述不可用步骤_计算机分级不可用-系统城...