X32汇编AAA,AAS,AAM,AAD,DAS,DAA
今天看了下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相关推荐
- BCD码指令 AAA DAA AAS DAS AAM AAD
2019独角兽企业重金招聘Python工程师标准>>> 十进制数(BCD码)运算指令 在计算机中十进制数是用BCD码来表示的,BCD码有两类:一类叫压缩型BCD码,一类叫非压缩型BC ...
- 博客摘录「 BCD码指令 AAA DAA AAS DAS AAM AAD」2023年4月7日
可见,AAS指令将影响状态标志位AF和CF,但SF.ZF.PF和OF状态标志位不确定. 例如想要进行两位十进制数的减法运算:13-4=?,可先将被减数和减数以非压缩型BCD码的形式分别存放在AH ...
- 汇编语言-012(扩展加法指令ADC、带借位减法指令SBB、执行加法后进行ASCII调整指令、AAS 、AAM、AAD 、DAA指令将和数转成压缩十进制格式)
1:ADC : 扩展加法指令ADC .386 .model flat,stdcall.stack 4096 ExitProcess PROTO,dwExitCode:DWORD.code main P ...
- AAA与AAM指令代码实验
1.从键盘输入2个数相加,得出结果 STACK SEGMENTSTL DB 100H DUP(?) STACK ENDS DATA SEGMENTINFOR1 DB "PLEASE Inpu ...
- x86汇编_ASCII和非压缩BCD码运算_AAA / AAS_笔记56
虽然 CPU 用二进制运算,但是也可以执行 ASCII 十进制串的运算.使用后者进行运算,对用户而言既便于输入也便于在控制台窗口显示,因为不用进行二进制转换.尽管 ASCII 运算执行速度比二进制运算 ...
- 8086汇编语言指令总结
根据工作需要,从基础学起,设计一台嵌入式CISC模型计算机,稍后上传. 先总结下,汇编语言指令,如下 1. MOV(传送) 指令写法:MOV target,source 功能描述:将源操作数sour ...
- 微机原理 单片机笔记
链接 十四个寄存器 寄存器和物理地址的形成 课后习题答案 一.基础知识 BCD码(Binary-Coded Decimal),用4位二进制数来表示1位十进制数中的0~9这10个数码,是一种二进制的数 ...
- 关于汇编语言学习的环境配置及使用方法
关于汇编语言的环境配置及使用方法 从学习汇编以来,很多人在汇编语言的环境配置上出现了很多问题,在学习小组内也有人会向我要链接或环境的一些配置文件.其实在这之前,我也是通过不断地实验和搜索才发现并解决了 ...
- 计算机cmp代表什么意思,CMP指令
CMP指令是由美国斯坦福大学提出的,英文名称是Chip multiprocessors,翻译成中文就是单芯片多处理器,也指多核心其思想是将大规模并行处理器中的SMP(对称多处理器)集成到同一芯片内,各 ...
最新文章
- bzoj2806: [Ctsc2012]Cheat
- K8S部署工具:KubeOperator集群部署
- 从一个小故事聊聊字符编码那些事
- 刚刚,阿里开源了一项重磅炸弹,终结程序员“中年危机”!
- sql几种删除语句的联系与区别
- 用面向对象的方法写敲门砖
- Oracle 关于事物的描述
- C 控制父、子进程的先后顺序执行
- 大数据职业理解_数据分析师真有那么好?其实正在面临3大职业困境
- 数据:以太坊2.0合约质押新增4.15万ETH
- ffmpeg 视频合并
- 基于Centos6.2 X64系统下的邮件系统(二)
- linux xxx is not in the sudoers file.This incident will be reported.的解决方法
- 外企应了解财税本地化技术(金税三期|批量开票|金税接口|自动开票等技术及理念)
- QQ,MSN,旺旺在线客服代码
- 《道德经》全文和译文
- java求100以内偶数和
- facebook 登陆失败 分享失败 原因汇总
- 数据文件检验坏块的利器-dbv
- 秋冬易感冒着凉 风寒感冒9大食疗方
热门文章
- 四川汶川县今天又连发生地震!
- 认证的公众号可以快速免费注册认证小程序
- 正则表达式-2021
- js日期格式转换Wed Mar 22 13:38:37 CST 2017 转换 为yyyy-mm-dd
- 微信speex音频格式转mp3
- html实现ipad投屏到显示器,iPad投屏的两种方式
- 最左推导和最右推导,语法树,二义性文法
- 刑侦科推理试题(不知来源,最右APP看到)
- PHP 面试总结(持续更新) --小丑
- 电脑台式计算机描述不可用,【计算机描述不可用】计算机描述不可用步骤_计算机分级不可用-系统城...