汇编--AAD,DAA,DAS详解

AAD   为下面的除法做准备   ,把AL 和 AH 两个单BCD码组成一个十进制数

1、AAD(调整除)

5.2该指令是在作除法前用于调整寄存器AH和AL之值,它是把二个寄存器中单BCD码组成一个十进制数值,其调整规则如下:

AL←AH*10+AL,AH←0

受影响的标志位:PF、SF和ZF(AF、CF和OF等都是无定义)

 MOV AX, 0502H
 MOV BL, 10D
 AAD           ;AH=0, AL=52H
 DIV BL         ;AH=2(余数), AL=5(商)

2、DAA(调整加十)

该指令是用于调整AL的值,该值是由指令ADD或ADC运算二个压缩型BCD码所得到的结果。压缩型BCD码是一个字节存放二个BCD码,低四位和高四位都是一个BCD码。其调整规则如下:

  • 如果AL的低四位大于9,或AF=1,那么,AL=AL+06H,并置AF=1;
  • 如果AL的高四位大于9,或CF=1,那么,AL=AL+60H,并置CF=1;
  • 如果以上两点都不成立,则,清除标志位AF和CF。

经过调整后,AL的值仍是压缩型BCD码,即:二个压缩型BCD码相加,并进行调整后,得到的结果还是压缩型BCD码。

受影响的标志位:AF、CF、PF、SF和ZF(OF无定义)

 MOV AL, 43H
 MOV BL, 29H
 ADD AL, BL     ;AL=6CH,其不是压缩型的BCD码,因为低四位‘B‘不是BCD码
 DAA          ;调整后,AL=72H,这是压缩型的BCD码,也有:43+29=72

3、DAS(调整减十)

该指令也是用于调整AL的值,AL是由指令SUB或SBB运算二个压缩型BCD码所得到的结果。其调整规则如下:

  • 如果AL的低四位大于9,或AF=1,那么,AL=AL-06H,并置AF=1;
  • 如果AL的高四位大于9,或CF=1,那么,AL=AL-60H,并置CF=1;
  • 如果以上两点都不成立,则,清除标志位AF和CF。

经过调整后,AL的值仍是压缩型BCD码,即:二个压缩型BCD码相减,并进行调整后,得到的结果还是压缩型BCD码。

受影响的标志位:AF、CF、PF、SF和ZF(OF无定义)

 MOV AL, 43H
 MOV BL, 29H
 SUB AL, BL    ;AL=1AH,其不是压缩型的BCD码,因为低四位‘A‘不是BCD码
 DAS         ;调整后,AL=14H,这是压缩型的BCD码,也有:43-29=14 

1

时间: 2024-10-13 17:48:50

汇编--AAD,DAA,DAS详解的相关文章

大脸猫讲逆向之ARM汇编中PC寄存器详解

i春秋作家:v4ever 近日,在研究一些开源native层hook方案的实现方式,并据此对ARM汇编层中容易出问题的一些地方做了整理,以便后来人能有从中有所收获并应用于现实问题中.当然,文中许多介绍参考了许多零散的文章,本文重点工作在于对相关概念的整理收集,并按相对合理顺序引出后文中对hook技术中的一些难点的解读. Android平台大多采用了ARM架构的CPU,而ARM属RISC,与X86架构的处理器有不同的特征,本文讲介绍ARM中不容易理解的PC寄存器各种问题,包括ARM流水线.PC寄存

X86汇编5.高级指令详解

最近学习了X86汇编,其实无论是古老的8086还是现在i3/5/7/9,Xeon3/5,在最基本原理上,都是相通的,只是CPU位数,寻址空间,寄存器个数,指令集的扩充等方面有所不同,对于学习,8086永不过时. 转移指令1.转移指令分类:(1)无条件转移指令,如: jmp(2)条件转移指令(3)循环指令,如: loop(4)过程(5)中断 操作符1.offset释义:由编译器处理的符号,功能是取得标号的偏移地址start: mov ax,offset start ;相当于mov ax, 0s:

16位汇编第六讲汇编指令详解第第三讲

                                          16位汇编第六讲汇编指令详解第第三讲 1.十进制调整指令 1. 十进制数调整指令对二进制运算的结果进行十进制调整,以得到十进制的运算结果 2.分成压缩BCD码和非压缩BCD码调整 简而言之: 以前的时候你有个手表,里面的数字是九,如果加一个1就是0了,就会产生进位, 不过这个是10进制进位的,所以应该是 a了,但是a的话就出错了.所以我们就出来了这个调整指令直接变为零,然后进位,也就是16进制码当做10进制使用

gcc/g++等编译器 编译原理: 预处理,编译,汇编,链接各步骤详解

摘自http://blog.csdn.net/elfprincexu/article/details/45043971 gcc/g++等编译器 编译原理: 预处理,编译,汇编,链接各步骤详解 C和C++编译器是集成的,编译一般分为四个步骤: 预处理(preprocessing)  ----------------- cpp/ gcc -E  编译(compilation) ------------------ cc1 / gcc -S 汇编(assembly)  ----------------

16位汇编第六讲汇编指令详解第二讲

16位汇编第六讲汇编指令详解第二讲 1.比较指令 CMP指令 1.CMP指令是将目的操作数减去源操作数,按照定义相应的设置状态标志 2.CMP指令执行的功能与SUB指令(相减指令)一样,但是不同的是CMP指令之根据结果设置标志位 而不修改值 可以操作的指令格式 CMP reg,imm/reg/mem CMP mem,imm/reg 上面是CMP指令的语法,具体的也可以查询帮助文档,inter手册 inter手册查的办法 第一个框代表了CMP指令的所有语法 比如 reg,reg 表示可以比较寄存器

16位汇编第五讲各种指令详解第一讲

汇编指令详解 8080指令详解 1.8086系统下,Inter指令系统共有117条指令(看似很多,分一下类) 1.数据传送类指令(专门传送数据的) 2.算术运算类指令(加减乘除的运算的) 3.位操作类指令(或  异货 与 -.) 4.串操作类指令 (内存拷贝,内存连续地址拷贝的操作) 5.控制转移类指令(跳转,比如C语言的Goto) 6.处理机控制类指令(计算机的待机 ,重启 等等,让CPU待机睡眠的指令) 学习指令的注意事项 1.指令的功能,也就是这个指令可以实现什么操作.通常的话,指令就是指

几种基本汇编指令详解

几种基本汇编指令详解 常见寄存器 寄存器 16位 32位 64位 累加寄存器 AX EAX RAX 基址寄存器 BX EBX RBX 计数寄存器 CX ECX RCX 数据寄存器 DX EDX RDX 堆栈基指针 BP EBP RBP 变址寄存器 SI ESI RSI 堆栈顶指针 SP ESP RSP 指令寄存器 IP EIP RIP 汇编指令 mov movb(8位).movw(16位).movl(32位).movq(64位) 寄存器寻址: movl %eax, %edx eax -> edx

OPCode详解及汇编与反汇编原理

1. 何为OPCode 在计算机科学领域中,操作码(Operation Code, OPCode)被用于描述机器语言指令中,指定要执行某种操作的那部分机器码,构成OPCode的指令格式和规范由处理器的指令规范指定.除了指令本身以外通常还有指令所需要的操作数,可能有的指令不需要显示的操作数.这些操作数可能是寄存器中的值,堆栈中的值,某块内存的值或者IO端口中的值等等. OPCode在不同的场合中通常具有不同的含义,例如PHP虚拟机(Zend VM).java虚拟机(JVM)以及一些软件保护虚拟机中

汇编 JMP 详解

汇编 JMP 详解 关键词说明 RVA: 相对虚拟地址(Relative Virtual Address),在内存中相对于PE文件装入地址的偏移位置,是一个相对地址. JMP 的 3 种类型 短跳转(Short Jmp,只能跳转到256字节的范围内),对应机器码:EB 近跳转(Near Jmp,可跳至同一段范围内的地址),对应机器码:E9 远跳转(Far Jmp,可跳至任意地址),对应机器码: EA 短跳转 和 近跳转 指令中包含的操作数都是相对于(E)IP的偏移. 远跳转指令中包含的是目标的绝