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