汇编语言(六):位操作类指令(AND, OR, XOR, NOT, TEST, 移位指令)

您所在的位置:网站首页 汇编的add指令 汇编语言(六):位操作类指令(AND, OR, XOR, NOT, TEST, 移位指令)

汇编语言(六):位操作类指令(AND, OR, XOR, NOT, TEST, 移位指令)

2023-09-15 00:23| 来源: 网络整理| 查看: 265

作为汇编语言的课程笔记,方便之后的复习与查阅

本篇为课程第七次课内容

目录 位操作类指令逻辑与指令AND逻辑或指令OR逻辑异或指令XOR逻辑非指令NOT测试指令TEST移位指令(shift)逻辑移位指令算术移位指令移位指令对标志的影响移位指令的意义循环移位指令(rotate)循环移位指令对标志的影响例子32位数移动位传送

位操作类指令

逻辑运算指令:

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


【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3