码迷,mamicode.com
首页 > 其他好文 > 详细

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

时间:2017-09-05 12:35:32      阅读:202      评论:0      收藏:0      [点我收藏+]

标签:完成   lin   区分   产生   循环移位   编码   符号位   有一个   das   

                                               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

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

标签:完成   lin   区分   产生   循环移位   编码   符号位   有一个   das   

原文地址:http://www.cnblogs.com/iBinary/p/7477874.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!