作为汇编语言的课程笔记,方便之后的复习与查阅
本篇为课程第七次课内容
目录
位操作类指令
逻辑运算指令:
AND
OR
XOR
NOT
TEST
移位指令:
- 逻辑、算术移位指令:
SHL
SHR
SAL
SAR
- 循环、带进位循环移位指令:
ROL
ROR
RCL
RCR
注意这些指令对标志位的影响
逻辑与指令AND
AND reg,imm/reg/mem ;reg←reg∧imm/reg/mem
AND mem,imm/reg ;mem←mem∧imm/reg
AND
指令设置CF
= OF
= 0,根据结果设置SF
、ZF
和PF
状态,而对AF
未定义
可以用来置某位某些位为0 ,不影响其他位
逻辑或指令OR
OR reg,imm/reg/mem ;reg←reg∨imm/reg/mem
OR mem,imm/reg ;mem←mem∨imm/reg
OR
指令设置CF
= OF
= 0,根据结果设置SF
、ZF
和PF
状态,而对AF
未定义
可以用来置某位某些位为1,不影响其他位
逻辑异或指令XOR
XOR reg,imm/reg/mem ;reg←reg⊕imm/reg/mem
XOR mem,imm/reg ;mem←mem⊕imm/reg
XOR
指令设置CF
= OF
= 0,根据结果设置SF
、ZF
和PF
状态,而对AF
未定义
可以用来求反某些位,不影响其他位
逻辑非指令NOT
NOT reg/mem ;reg/mem←~reg/mem
NOT
指令不影响标志位
测试指令TEST
对两个操作数执行逻辑与运算,结果不回送到目的操作数
TEST reg,imm/reg/mem ;reg∧imm/reg/mem
TEST mem,imm/reg ;mem∧imm/reg
TEST
指令设置CF
= OF
= 0,根据结果设置SF
、ZF
和PF
状态,而对AF
未定义
TEST
指令通常用于检测一些条件是否满足,但又不希望改变原操作数的情况
例:测试某一位为0或1
test al,01h ;测试AL的最低位D0
jnz there ;标志ZF=0,即D0=1
;则程序转移到there
... ;否则ZF=1,即D0=0,顺序执行
there: ...
移位指令(shift)
逻辑移位指令
SHL reg/mem,1/CL (Shift Logical Left)
;逻辑左移,最高位进入CF,最低位补0
SHR reg/mem,1/CL (Shift Logical Right)
;逻辑右移,最低位进入CF,最高位补0
算术移位指令
SAL reg/mem,1/CL (Shift Arithmetic Left)
;算术左移,最高位进入CF,最低位补0 (同SHL)
SAR reg/mem,1/CL (Shift Arithmetic Right)
;算术右移,最低位进入CF,最高位不变(保证符号位不变)
;SAR也是右移,只不过一直用原来符号位的数来补
移位指令对标志的影响
- 按照移入的位设置进位标志
CF
- 根据移位后的结果影响
SF
、ZF
、PF
- 对
AF
没有定义 - 如果进行一位移动,则按照操作数的最高符号位是否改变,相应设置溢出标志
OF
:如果移位前的操作数最高位与移位后操作数的最高位不同(有变化),则OF
= 1;否则OF
= 0。当移位次数大于1
时,OF
不确定
mov cl,4
mov al,f0h
shl al,1 ;al=e0h CF=1,SF=1、ZF=0、PF=0,OF=0
shr al,1 ;al=70h CF=0,SF=0、ZF=0、PF=0、OF=1
sar al,1 ;al=38h CF=0,SF=0、ZF=0、PF=0、OF=0
sar al,cl ;al=03h CF=1,SF=0、ZF=0、PF=1
移位指令的意义
一个数左移1位相当于乘以2,右移1位相当于除以2
逻辑移位适于无符号数的移位处理:
- 逻辑左移一位,相当于无符号数乘2,
CF
反映进位 - 逻辑右移一位,相当于无符号数除以2,商在目的操作数中,余数由
CF
标志反映
算术移位适于带符号数的移位处理:
- 算术左移一位,如果符号位不变,相当于有符号数乘2,否则运算结果不正确
- 算术右移一位, 相当于有符号数除以2;商在目的操作数中,余数由
CF
标志反映
使用移位指令将一个数扩大或缩小 2 n 2^n 2n倍,比使用乘法或除法指令的速度快
使用移位和加减指令实现dx←3×ax+7×bx
(不许使用乘法指令):
mov si,ax
shl si,1 ;si←2×ax
add si,ax ;si←3×ax
mov dx,bx
mov cl,03h
shl dx,cl ;dx←8×bx
sub dx,bx ;dx←7×bx
add dx,si ;dx←7×bx+3×ax
循环移位指令(rotate)
将操作数从一端移出的位返回到另一端形成循环,分成不带进位和带进位,分别具有左移或右移操作
循环移位的同时,被移位的那个数也会进入CF
ROL reg/mem,1/CL ;(Rotate Left) 不带进位循环左移
ROR reg/mem,1/CL ;(Rotate Right) 不带进位循环右移
RCL reg/mem,1/CL ;(Rotate Carry Left) 带进位循环左移 相当于是和CF一起,9位一起进行循环移位
RCR reg/mem,1/CL ;(Rotate Carry Right) 带进位循环右移
循环移位指令对标志的影响
- 按照指令功能设置进位标志
CF
- 不影响
SF
、ZF
、PF
、AF
- 如果进行一位移动,则按照操作数的最高符号位是否改变,相应设置溢出标志
OF
:如果移位前的操作数最高位与移位后操作数的最高位不同(有变化),则OF
= 1;否则OF
= 0。当移位次数大于1
时,OF
不确定
例子
32位数移动
将DX.AX
中32位数值左移一位
shl ax,1
rcl dx,1
位传送
把AL
最低位送BL
最低位,保持AL
不变
ror bl,1
ror al,1
rcl bl,1
rol al,1