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

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

1.十进制调整指令

1. 十进制数调整指令对二进制运算的结果进行十进制调整,以得到十进制的运算结果 2.分成压缩BCD码和非压缩BCD码调整 简而言之:          以前的时候你有个手表,里面的数字是九,如果加一个1就是0了,就会产生进位, 不过这个是10进制进位的,所以应该是 a了,但是a的话就出错了.所以我们就出来了这个调整指令直接变为零,然后进位,也就是16进制码当做10进制使用 压缩BCD          压缩BCD就是4位表示一个数字 非压缩BCD          非压缩就是一个字节表示一个数字(高4位通常为零) 例子 真值               8        64 二进制编码       08H        40H 压缩BCD码      08H        64H 非压缩BCD码  08H        0604H 可以看出,8如果是个位数,是不变的 如果64那么压缩的是4位表示一个数字非压缩的就是1个字节表示,高位为零.   压缩BCD吗的加减调整指令 DAA(加法的调整指令) DAS (减法的调整指令) DAA 后缀A是Add的意思,后缀s是Sub的意思 例子
mov al,68h ;压缩的BCD码是68 mov bl,28h 压缩的BCD码28 add al,bl 二进制加法,al + bl 赋值为al daa (十进制调整) al = 68h + 28h = 90h
  但是因为daa了,所以是十进制进位 是96 简单理解就是,本来16进制 9+1 = A的,但是十进制调整,就不能是A了,需要变为0,结果是10了 DAA的内部原理就是遇到a(….) +6 同理DAS也是-6 只不过是通过标志位完成的(辅助标志位) 减法例子:      
mov al,68h mov bl,28h sub al,bl das ;十进制调整:al=40h
  ;实现压缩BCD码加法:68-28=40  

非压缩BCD的加,和减法的调整指令

AAA,AAS 例子          mov ax,0109  (其实是想显示19)          mov al,1          aaa 调整al 减法的例子:         
mov ax,0100h sub al,1 aas
  非压缩BCD的乘法,和除法调整指令 AAM,AAD 加法的:
mov ax, 0205h 真值是0205 mov bx, 2 赋值乘数为2 mul bx 相乘 aam 调整
  除法的          
mov ax, 0102h mov bl, 2 aad div bl
  除法的需要先调整,在相   二丶位操作类指令          分为三类 1.逻辑运算指令          AND OR XOR NOT TEST 2、移位指令 SHL  SHR  SAR 3、循环移位指令 ROL  ROR  RCL  RCR  

1.逻辑AND

寻址公式,指令 AND reg,imm/reg/mem ;reg←reg∧imm/reg/mem AND mem,imm/reg ;mem←mem∧imm/reg 作用: 1.对两个操作数执行逻辑与运算,结果送到目的操作数 2.AND指令设置CF = OF = 0,根据结果设置SF、ZF和PF状态,而对AF未定义 AND 就是C语言的与运算,1 & 1 = 1  1&0 = 0

2.逻辑指令 OR(或运算)

作用: 1.对两个操作数执行逻辑或运算,结果送到目的操作数 2.OR指令设置CF = OF = 0,根据结果设置SF、ZF和PF状态,而对AF未定义 操作指令: OR reg,imm/reg/mem ;reg←reg∨imm/reg/mem OR mem,imm/reg ;mem←mem∨imm/reg      C语言中的或运算 置位用的

3.逻辑异或指令XOR

作用: 对两个操作数执行逻辑异或运算,结果送到目的操作数 XOR指令设置CF = OF = 0,根据结果设置SF、ZF和PF状态,而对AF未定义   操作指令:          XOR reg,imm/reg/mem ;reg←reg⊕imm/reg/mem XOR mem,imm/reg ;mem←mem⊕imm/reg C语言中的疑或指令,相同为假,不同为真.

4.逻辑非指令NOT(C语言中的位取反~)

作用: 对一个操作数执行逻辑非运算 NOT指令是一个单操作数指令 NOT指令不影响标志位 操作指令:          NOT reg/mem ;reg/mem←~reg/mem  

5.测试指令TEST

作用: 1.对两个操作数执行逻辑与运算,结果不回送到目的操作数 TEST指令和CMP指令类似,CMP指令内部是相减然后设置标志位 而TEST指令是内部相与,然后设置标志位 2.AND指令设置CF = OF = 0,根据结果设置SF、ZF和PF状态,而对AF未定义   指令:          TEST reg,imm/reg/mem                   ;reg∧imm/reg/mem          TEST mem,imm/reg         ;mem∧imm/reg 测试指令,一般用于零判断 优先使用Test指令,因为TEST指令比CMP指令快一点  

6.移位指令(shift)

左移指令:

SHL SAL (逻辑左移,和算术左移) 逻辑左移: 移动的时候,补零          SHL:逻辑左移,最高位进入CF,最低位补0          SAL:   算术左移,最高位进入CF,最低位补0 其中逻辑左移和算术左移是一样的,一般都会汇编成逻辑左移 算术左移: 移动的时候补符号位(和C语言一样) 作用: 将操作数移动一位或多位,分成逻辑移位和算术移位,分别具有左移或右移操作 操作指令:          SHL reg/mem,1/CL   (其中CL是次数,在8086的中,移动一次可以直接写,但是移动多次比如放到计数器中) 例如          SHL al,1  (移动一个可以)          SHL al,2  (这样不可以,必须放到CL中) 改为          mov cl,2          SHL  al,2 右移指令: SHR reg/mem,1/CL 逻辑右移,最低位进入CF,最高位补0 SAR reg/mem,1/CL 算术右移,最低位进入CF,最高位不变 右移的话不会是一样的,不和左移一样.他会有符号位的区分的. 应用:          一般来说,逻辑左移,算术左移,逻辑右移,算术右移都有特定的应用         最高位置CF       逻辑右移SHR 值CF位补零 SAR则补符号位   移位指令对标志的影响 按照移入的位设置进位标志CF 根据移位后的结果影响SF、ZF、PF 对AF没有定义 如果进行一位移动,则按照操作数的最高符号位是否改变,相应设置溢出标志OF:如果移位前的操作数最高位与移位后操作数的最高位不同(有变化),则OF = 1;否则OF = 0。当移位次数大于1时,OF不确定 移位乘法和除法          逻辑左移一位,相当于无符号的数*2          逻辑右移一位相当于无符号数/2    

7.循环移位指令

                    作用:          将操作数从一端移出的位返回到另一端形成循环,分成不带进位和带进位,分别具有左移或右移操作 指令:          ROL reg/mem,1/CL ;不带进位循环左移          ROR reg/mem,1/CL         ;不带进位循环右移          RCL reg/mem,1/CL ;带进位循环左移          RCR reg/mem,1/CL ;带进位循环右移  

不带进位循环左移

    可以看出,高位有效位(MSB)的高位,给低位了,(相当于高位和低位互换了)然后高位置CF位

不带进位循环右移

    这个则是相反,低位和高位互换,然后还是高位置CF位  

带进位的左循环移位RCL

    这个则是最高位给CF位保存,然后CF位给低位,(相当于中间有一个CF位做中转)  

带进位的右循环移位RCR

    这个则是相反,最低位先给CF位保存,CF位再给最高位 一般循环带进位的移位指令,适用于32位数的计算(8086下)

循环移位指令对标志的影响

按照指令功能设置进位标志CF 不影响SF、ZF、PF、AF 如果进行一位移动,则按照操作数的最高符号位是否改变,相应设置溢出标志OF:如果移位前的操作数最高位与移位后操作数的最高位不同(有变化),则OF = 1;否则OF = 0。当移位次数大于1时,OF不确定  

32位数的计算

    首先左移一位,最高位置CF位,然后带进位左移一位,CF位则给DX位进位,则产生了进位 资料: 链接:http://pan.baidu.com/s/1jHWF2fG 密码:ykum
posted @ 2017-09-05 11:39 iBinary 阅读(...) 评论(...) 编辑 收藏