逻辑运算指令
1.逻辑与and
and dest,src 目的操作数:寄存器和存储单元 源操作数:立即数、寄存器、存储单元 (不能都是存储器操作数) and指令设置标志 CF=OF=0
2.逻辑或or
or dest,src 同and
3.逻辑非not
not是单操作数指令 求反 支持的操作数是寄存器和存储单元 不影响标志位
4.逻辑异或xor
xor dest,src 同 and or
书上例题用到了 call dispbd 作用是 显示32位二进制数 (例题简单不再记录)
5.测试指令test
test dest,src ;将dest和src 进行逻辑与运算
test指令不返回逻辑与的结果,只根据结果设置状态标志(and设置标志CF=OF=0 test只希望设置标志但是不希望改变源操作数的情况)
移位指令
1.移位指令
SHL reg/mem,18/CL ;逻辑左移:reg/mem左移i8/CL位,最低位补0,最高位进入CF
SHR reg/mem,18/CL ;逻辑右移:reg/mem右移i8/CL位,最高位补0,最低位进入CF
SAL reg/mem,18/CL ;算术左移:同SHL
SAR reg/mem,18/CL ;算术右移:reg/mem右移i8/CL位,最高位不变,最低为进入CF
根据最高位或者最低位的移出设置CF,根据移位后的结果影响SF,ZF,PF,如果进行1位移动,则按照操作数的最高符号位是否改变相应设置溢出标志OF:如果移位前与移位后的最高位不同,则OF=1,否则OF=0,当移位次数大于1时,OF不确定
移位指令实现乘法程序
;eg3.14.asm in windows Console
include io32.inc
.data
wvar word 34000
.code
start:
xor eax,eax ;xor 异或指令,相异为1,所以eax=0
mov ax,wvar ;ax=wvar
shl eax,1 ;eax左移1位 相当于乘2
mov ebx,eax ; ebx=eax
shl ebx,2 ;ebx左移2位 相当于乘4 即ebx=eax8
add eax,ebx ;相加 eax=eax10
call dispuid ;显示乘积
call dispcrlf ;换行
imul eax,10 ;乘法指令
call dispuid ;显示 进行验证
exit 0
end start
2.循环移位指令
ROL:不带进位循环左移指令
ROR:不带进位循环右移指令
RCL:带进位循环左移指令
RCR:带进位循环右移指令
循环移位指令的操作数形式与移位指令相同,按照指令功能设置进位标志CF,但不影响SF、ZF、PF标志。对OF的影响同前
循环移位程序
;eg3.20.asm in windows Console
include io32.inc
.data
qvar qword 1234567887654321h
ascii byte ‘38’ ;十进制3对应十六进制33 十进制8对应十六进制38
bcd byte ?
.code
start:
mov ecx,4
again:
shr dword ptr qvar +4,1 ;逻辑右移1位 高32位(+4)
rcr dword ptr qvar,1 ;带进位循环右移1位 低32位
loop again
mov al,ascii ;al=33H
and al,0fh ;33H与0fH与运算 即00110011 00001111相与 即al=00000011
mov ah,ascii+1 ;ah=38H 00111000B
shl ah,4 ;ah逻辑左移4位 ah=10000000
or al,ah ;00000011 10000000进行或运算 al=10000011B=83H
mov bcd,al ;bcd=al
call disprd
exit 0
end start