博客
关于我
汇编语言(六):位操作类指令(AND, OR, XOR, NOT, TEST, 移位指令)
阅读量:375 次
发布时间:2019-03-04

本文共 2576 字,大约阅读时间需要 8 分钟。

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

本篇为课程第七次课内容

目录

位操作类指令

逻辑运算指令:

  • AND OR XOR NOT TEST

移位指令:

  • 逻辑、算术移位指令:
    SHL SHR SAL SAR
  • 循环、带进位循环移位指令:
    ROL ROR RCL RCR

注意这些指令对标志位的影响

逻辑与指令AND

AND reg,imm/reg/mem 	;reg←reg∧imm/reg/memAND mem,imm/reg 		;mem←mem∧imm/reg

AND指令设置CF = OF = 0,根据结果设置SFZFPF状态,而对AF未定义

可以用来置某位某些位为0 ,不影响其他位

逻辑或指令OR

OR reg,imm/reg/mem 		;reg←reg∨imm/reg/memOR mem,imm/reg			;mem←mem∨imm/reg

OR指令设置CF = OF = 0,根据结果设置SFZFPF状态,而对AF未定义

可以用来置某位某些位为1,不影响其他位

逻辑异或指令XOR

XOR reg,imm/reg/mem 	;reg←reg⊕imm/reg/memXOR mem,imm/reg 		;mem←mem⊕imm/reg

XOR指令设置CF = OF = 0,根据结果设置SFZFPF状态,而对AF未定义

可以用来求反某些位,不影响其他位

逻辑非指令NOT

NOT reg/mem 			;reg/mem←~reg/mem

NOT指令不影响标志位

测试指令TEST

对两个操作数执行逻辑与运算,结果不回送到目的操作数

TEST reg,imm/reg/mem		;reg∧imm/reg/memTEST mem,imm/reg			;mem∧imm/reg

TEST指令设置CF = OF = 0,根据结果设置SFZFPF状态,而对AF未定义

TEST指令通常用于检测一些条件是否满足,但又不希望改变原操作数的情况

例:测试某一位为0或1

test al,01h		;测试AL的最低位D0jnz there		;标志ZF=0,即D0=1				;则程序转移到there...				;否则ZF=1,即D0=0,顺序执行there: ...

移位指令(shift)

逻辑移位指令

SHL reg/mem,1/CL     	 (Shift Logical Left) 						;逻辑左移,最高位进入CF,最低位补0SHR 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
  • 根据移位后的结果影响SFZFPF
  • AF没有定义
  • 如果进行一位移动,则按照操作数的最高符号位是否改变,相应设置溢出标志OF:如果移位前的操作数最高位与移位后操作数的最高位不同(有变化),则OF = 1;否则OF = 0。当移位次数大于1时,OF不确定
mov cl,4mov al,f0h	shl al,1		;al=e0h  CF=1,SF=1、ZF=0、PF=0,OF=0shr al,1		;al=70h CF=0,SF=0、ZF=0、PF=0、OF=1sar al,1		;al=38h  CF=0,SF=0、ZF=0、PF=0、OF=0sar 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,axshl si,1	;si←2×axadd si,ax	;si←3×axmov dx,bxmov cl,03hshl dx,cl	;dx←8×bxsub dx,bx	;dx←7×bxadd 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
  • 不影响SFZFPFAF
  • 如果进行一位移动,则按照操作数的最高符号位是否改变,相应设置溢出标志OF:如果移位前的操作数最高位与移位后操作数的最高位不同(有变化),则OF = 1;否则OF = 0。当移位次数大于1时,OF不确定

例子

32位数移动

DX.AX中32位数值左移一位

shl ax,1rcl dx,1

在这里插入图片描述

位传送

AL最低位送BL最低位,保持AL不变

ror bl,1ror al,1rcl bl,1rol al,1

转载地址:http://mtih.baihongyu.com/

你可能感兴趣的文章
MySQL Error Handling in Stored Procedures---转载
查看>>
MVC 区域功能
查看>>
MySQL FEDERATED 提示
查看>>
mysql generic安装_MySQL 5.6 Generic Binary安装与配置_MySQL
查看>>
Mysql group by
查看>>
MySQL I 有福啦,窗口函数大大提高了取数的效率!
查看>>
mysql id自动增长 初始值 Mysql重置auto_increment初始值
查看>>
MySQL in 太多过慢的 3 种解决方案
查看>>
MySQL InnoDB 三大文件日志,看完秒懂
查看>>
Mysql InnoDB 数据更新导致锁表
查看>>
Mysql Innodb 锁机制
查看>>
MySQL InnoDB中意向锁的作用及原理探
查看>>
MySQL InnoDB事务隔离级别与锁机制深入解析
查看>>
Mysql InnoDB存储引擎 —— 数据页
查看>>
Mysql InnoDB存储引擎中的checkpoint技术
查看>>
Mysql InnoDB存储引擎中缓冲池Buffer Pool、Redo Log、Bin Log、Undo Log、Channge Buffer
查看>>
MySQL InnoDB引擎的锁机制详解
查看>>
Mysql INNODB引擎行锁的3种算法 Record Lock Next-Key Lock Grap Lock
查看>>
mysql InnoDB数据存储引擎 的B+树索引原理
查看>>
mysql innodb通过使用mvcc来实现可重复读
查看>>