上一题下一题
跳转到
 
 
  世界如此多姿,发展如此迅速,窥一斑未必还能知全豹。但正如万花筒一样,每一个管窥都色彩斑斓。  
 
 
  知识通道 | 学习首页 | 教师首页 | PK首页 | 知识创造首页 | 企业首页 | 登录
 
本文对应知识领域
逻辑运算和移位指令
作者:未知 申领版权
2010年12月12日 共有 2201 次访问 【添加到收藏夹】 【我要附加题目
受欢迎度:

    

逻辑运算和移位指令

这组指令包括逻辑运算﹑移位和循环移位指令三部分。逻辑运算指令除指令NOT外,均有两个操作数。移位和循环移位指令只有一个操作数。关于这组指令有如下几点通用说明,清予以注意:
    1. 如果指令有两个操作数,那么这两个操作数也可如图2.16所示结合。但最多只能有一个为储存器操作数。
    2. 只有通用寄存器或存储器操作数可作为目的操作数,用于存放运算结果。
    3. 如果只有一个操作数,则该操作数既是源又是目的。
    4. 操作数可以是字节,也可以是字。但如果有两个操作数,则它们的类型必须一致,即同时为字节,或同时为字。
    5. 对于储存器操作数可采用2.3节中介绍的四种存储器操作数寻址方式。
    1. 逻辑运算指令
    1) 否操作指令NOT
    否操作指令的格式如下;
    NOT  OPRD
    这条指令把操作数OPRD取反,然后送回OPRD。
    例如:
    NOT  AX
    操作数OPRD 可以是通用寄存器,也可以是存储器操作数。此指令对标志没有影响。
    2) 与操作指令AND
    与操作指令的格式如下:
    AND   OPRD1,  OPRD2
    这条指令对两个操作数进行按位的逻辑“与”运算,结果送到目的操作数OPRD1
    例如: 
    AND   DH,   DH
    AND   AX,ES:[SI]
    该指令执行以后,标志CF=0,标志OF=0,标志PF﹑ZF﹑SF反映运算结果,标志AF未定义。
    某个操作数自己与自己相 “与”,则值不变,但可使进位标志CF清0。与操作指令主要用在使一个操作数中的若干位维持不变,而另外若干位清为0的场合。把要维持不变的这些位与“1”相“与”,而把要清为0的这些位与“0”相“与”就能达到这样的目的。
    例如:
    MOV  AL,34H          ;AL=34H
    AND  AL,0FH          ;AL=04H
    3) 或操作指令OR
    或操作指令的格式如下:
    OR  OPRD1,OPRD2
    这条指令对两个操作数进行按位的逻辑“或”运算,结果送到目的操作数OPRD1。
    例如;
    OR   AX,8080H
    OR   CL,AL
    OR   [BX—3],AX
    OR指令执行以后,标志CF=0,标志OF=0,标志PF﹑ZF﹑SF反映运算结果,标志AF未定义。
    某个操作数自己与自己相“或”,则值不变,但可使进位标志CF清0,或操作指令主要用在使一个操作数中的若干位维持不变,而另外若干位置为1的场合。把要维持不变的这些位与“0”相“或”,而把要置为1的这些位与“1”相“或”就能达到这样的目的。
    例如:
    MOV   AL,41H         ;AL=01000001B,B表示二进制
    OR     AL,20H         ;AL-01100001B
    4)异或操作指令XOR
    异或指令的格式如下:
    XOR  OPRD1,  OPRD2
    这条指令对两个操作数进行按位的逻辑“异或”运算,结果送到目的操作数OPRD1。该指令执行以后,标志CF=0,标志OF=0,标志PF﹑ZF﹑SF反映运算结果,标志AF未定义。
    某个操作数自己与自己相“异或”,则结果为0,并可使进位标志CF清0。例如:
    XOR    DX,DC      ;DX=0,     CF=0
    异或操作指令主要用在使一个操作数中的若干位维持不变,而另外若干位置取反的场合。把要维持不变的这些位与“0”相“异或”,而把要取反的这些位与“1”相“异或”就能达到这样的目的。例如:
    MOV    AL,34H       ;AL=00110100B,符号B表示二进制
    XOR    AL,0FH       ;AL=00111011B
    5)测试指令TEST
    测试指令的格式如下:
    TEST   OPRD1,    OPRD2
    这条指令和指令AND类似,也把两个操作数进行按位“与”,但结果不送到操作数OPRD1,仅仅影响标志。该指令执行以后,标志ZF﹑PF和SF反映运算结果,标志CF和OF被清0。
    该指令通常用于检测某些位是否为1,但又不希望改变原操作数值的场合。例如要检查AL中的位6或位2是否有一位为1,可使用如下的指令:
    TEST   AL,01000100B;   符号B表示二进制
    如果位6和位2全为0,那么在执行上面的指令后,ZF被置1,否则Z
    被清0。
    2. 一般移位指令
    8086/8088有三条一般移位指令:算术左移/逻辑左移指令,算术右移指令,逻辑右移指令。这三条指令的一般格式如下:
    SAL   OPRD,m          ;算术左移指令(同逻辑左移指令)
    SHL   OPRD,m          ;逻辑左移指令
    SAR   OPRD,m,         ;算术右移指令
    SHR   OPRD,m          ; 逻辑右移指令
    其中,m是移位位数,或为1或为CL,当要移多个位时,移位位数需存放在CL寄存器中。操作数OPRD可以是通用寄存器,也可以是存储器操作数。
    1)算术左移或逻辑左移指令SAL/SHL(Shift Arithmetic Left 或Shift logic left)
    算术左移或逻辑左移进行相同的动作,尽管为了方便提供有两个助记符,但只有一条机器指令。具体格式如下:
    SHL  OPRD,m      或者
    SHL  OPRD,m
    算术左移SAL/逻辑左移SHL指令把操作数OPRD左移m位,每移动一位,右边用0补足一位,移出的最高位进入标志位CF。如图2。18(a)所示。
    下面的程序片段用于说明该指令的使用及其对标志位的影响,安排的注释给出了指令执行完后的操作数值和受影响的标志变化情况。
    MOV  AL,8CH  ;AL=8CH
    SHL   AL,1     ;AL=18H,CF=1,PF=1ZF=0,SF=0,OF=1
    MOV  CL,6     ;CL=6
    SHL   AL,CL   ;AL=0,CF=0,PF=1,ZF=1,SF=0,OF=0
    只要左移以后的结果未超出一个字节或一个字的表达范围,那么每左移一次,原操作数每一位的权增加了一倍,也即相当于原数乘2。下面的程序片段实现把寄存器AL中的内容(设为无符号数)乘10,结果存放在AX中。
    XOR  AH,AH     ;(AH)=0
    SHL   AX,1      ;2X
    MOV  BX,AX    ;暂存2X
    SHL   AX,1      ;4X
    SHL   AX,1      ;8X
    ADD  AX,BX     ;8X 2X
    CF     最高有效位     操作数         最低有效位
    
    (a)逻辑左移/算术左移
    
    最高有效位     操作数        最低有效位      CF
    
    
    (b)算术右移
    最高有效位    操作数          最低有效位      CF
    0 
    (C) 逻辑右移
    图2.17  移位指令示意图
    2) 算术右移指令SAR(Shift A rithmetic Right)
    算术右移指令的格式如下:
    SAR  OPRD,m
    该指令使操作数右移m位,同时每移一位,左边的符号位保持不变,移出的最低位进入标志位CF。如图2.17(b)所示。
    例如:
    SAR  AL,1
    SAR  BX,CL
    对于有符号数和无符号数而言,算术右移一位相当于除以2。
    3) 逻辑右移指令SHR(Shift logic Right)
    逻辑右移指令的格式如下:
    SHR   OPRD,m
    该指令使操作右移m位,同时每移一位,左边用0补足,移出的最低位进入标志位CF。如图2.17(c)所示。例如:
    SHR  BL,1
    SHR  AX,CL
    对于无符号数而言,逻辑右移一位相当于除以2。
    在汇编语言程序设计中,经常需要对以位为单位的数据进行合并和分解处理。一般通过移位指令和逻辑运算指令进行这种数据的合并和分解处理。
    例,假设DATA1和DATA2各长4位,分别存放在AL寄存器的低4位和高4位中,现要把它们分别存放到BL寄存器和BH寄存器的低4位中。
    下面的程序片段能实现上述要求:
    ……
    MOV   BL,AL
    AND   LB,0FH   ;得DATA1
    MOV   AH,AL   ;得DATA2
    MOV   CL,4
    SHR   BH,CL
    ……
    3. 循环移位指令
    8086/8088有四条循环移位指令:左循环移位指令ROL(Rotate  Left ),右循环移位指令ROR(Rotate  Right)。带进位左循环移位指令RCL(Rotate Left through CF),带进位右循环移位指令RCR(Rotate Right through CF)。这些指令可以一次只移一位,也可以一次移多位。如移多位,那么移位次数存放在CL寄存器中。
    这些指令的格式如下:
    ROL   OPRD,m
    ROR   OPRD,m
    RCL   OPRD,m
    RCR   OPRD,m
    其中,m是移位次数,或为1或为CL。操作数OPRD可以是通用寄存器,也可以是存储器操作数。
    前两条循环指令没有把进位标志位CF包含在循环的环中;后两条循环指令把进位标志CF包含在循环的环中,即作为整个循环的一部分。四条循环指令的操作如图2.18所示。
    CF           最高有效位       操作数        最低有效位
    
    
    
    (a)左循环移位指令ROL
    
    
    
    (b)右循环移位指令ROR
    
    
    
    (c)带进位右循环移位指令RCR
    
    
    (d) 带进位右循环移位指令RCR
    图2.18循环移位指令示意图
    这些指令只影响标志CF和OF。
    左循环移位指令ROL,它每移位一次,操作数左移,其最高位移入最低位,同时最高位也移入进位标志CF。
    右循环移位指令ROR,它每移位一次,操作数右移,其最低位移入最高位,同时最低位也移入进位标志CF。
    带进位左循环移位指令RCL,它每移位一次,操作数左移,其最高位移入进位标志CF,CF移入最低位。
    带进位右循环移位指令RCL,它每移位一次,操作数右移,其最低位移入进位标志CF,CF移入最高位。
    对于不带进位的循环移位指令而言,如果操作数是8位,那么在移位8次后,操作数就能复原;如果操作是16位,那么在移位16次后,操作数就能复原。对于带进位的循环移位指令而言,如果操作数是8位,那么在移位9次后,操作就能复原;如果操作时16位,那么在移位17次后,操作就能复原。例如:
    MOV  CL,9
    RCR  AL,CL
    通过带进位循环移位指令和其他移位指令的结合,可以实现两个或多个操作数的重新结合。
    例,下面的程序片段实现把AL的高4位与低4位交换:
    ROL   AL,1
    ROL   AL,1
    ROL   AL,1
    ROL   AL,1
    例,下面的程序片段实现把AL的最低位送入BL的最低位,仍保持AL不变:
    ROR   BL,1
    ROR   AL,1
    RCL   BL,1
    ROL   AL,1
    例,设DATA1存放在AL的低4位,DATA2存放在AH的低4位,DATA3存放在SI的低4位,DATA4存放在SI的高4位。现要把这四个数据合并为16位,并存放到DX寄存器中。
    

 

相关新闻

运用购买指令成功缔结客户,最具诱惑力的催眠式销售方法
Win32汇编的环境和基础
Win32汇编教程五-菜单和加速键的使用
win32汇编教程四-编写一个简单的窗口
Win32汇编教程三
Win32汇编程序的结构和语法
Win32汇编的环境和基础 Win32汇编教程之一
未组合BCD码的算术运算调整指令
字符串操作举例
字符串存储指令(STOre String)

您可能对这些感兴趣  

干货分享|10本最受国外孩子喜爱的英文词典——上
从孩子的表现看父母的缺点!请家长对号入座,看看你是哪一类?
20条制作PPT的视觉原则
培训简史:培训者必知的历史轨迹
广田丰管理培训生人才培养调查报告
第4讲 作为上司的职业经理
第3讲 作为同事的职业经理
第2讲 作为下属的职业经理
第1讲 培养经理人的管理素养
酒店前台新员工上岗培训计划

题目筛选器
日期:
类型:
状态:
得分: <=
分类:
作者:
职业:
关键字:
搜索

 
 
 
  焦点事件
 
  知识体系
 
  职业列表
 
 
  最热文章
 
 
  最多引用文章
 
 
  最新文章
 
 
 
 
网站介绍 | 广告服务 | 招聘信息 | 保护隐私权 | 免责条款 | 法律顾问 | 意见反馈
版权所有 不得转载
沪ICP备 10203777 号 联系电话:021-54428255
  帮助提示    
《我的太学》是一种全新的应用,您在操作中遇到疑问或者问题,请拨打电话13564659895,15921448526。
《我的太学》