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

2018-01-05 17:47:02 浏览数 (1)

                             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的意思

例子

代码语言:javascript复制
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

只不过是通过标志位完成的(辅助标志位)

减法例子:

代码语言:javascript复制
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

减法的例子:

代码语言:javascript复制
mov ax,0100h

sub al,1

aas

非压缩BCD的乘法,和除法调整指令

AAM,AAD

加法的:

代码语言:javascript复制
mov ax, 0205h   真值是0205

mov bx, 2             赋值乘数为2

mul bx                  相乘

aam                             调整

除法的

代码语言:javascript复制
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

0 人点赞