`
nannan408
  • 浏览: 1783927 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

算术移位操作和逻辑移位操作的区别和联系(转)

阅读更多
  移位操作有很多种,一般知道算术移位操作(2个),逻辑移位(2个)这四个,一般的程序就够用了。
   移位操作都会引起被移位方向的一些数据丢失,所以需控制好。逻辑移位是连标志位(正负号)一起操作的,所以可能会改变正负号。而算术移位是固定好标志位,移动其他的位,不会改变正负号,但前面被移动的位是补0还是补1,如果标志位是1,则都补1,是0,则都补0。

1.逻辑移位(不管是左移位还是右移位)   都是空缺处补0

例如:     mov   ax   ,   1100_0111_0110_1000B
                mov   cl   ,   3
                shl   ax   ,   cl                                     ;   结果     ax   =   0011_1011_0100_0000

                mov   ax   ,   1100_0111_0110_1000B
                mov   cl   ,   3
                shr   ax   ,   cl                                     ;   结果     ax   =   0001_1000_1110_1101

2.算术移位要保证符号位的不改变(逻辑左移位补0,   逻辑右移位看符号位)

例如:     mov   ax   ,   1100_0111_0110_1000B
                mov   cl   ,   3
                sal   ax   ,   cl                                     ;   结果     ax   =   0011_1011_0100_0000

                mov   ax   ,   1100_0111_0110_1000B
                mov   cl   ,   3
                sar   ax   ,   cl                                     ;   结果     ax   =   1111_1000_1110_1101

                mov   ax   ,   0100_0111_0110_1000B
                mov   cl   ,   3
                sar   ax   ,   cl                                     ;   结果     ax   =   0000_1000_1110_1101        

转自:http://topic.csdn.net/t/20051123/00/4411562.html
3.移位指令详细介绍
SHL、SHR、SAL、SAR: 移位指令
--------------------------------------------------------------------------------


;SHL(Shift Left):             逻辑左移
;SHR(Shift Right):            逻辑右移
;SAL(Shift Arithmetic Left):  算术左移
;SAR(Shift Arithmetic Right): 算术右移

;其中的 SHL 和 SAL 相同, 但 SHR 和 SAR 不同.

;SHL、SAL: 每位左移, 低位补 0,  高位进 CF
;SHR     : 每位右移, 低位进 CF, 高位补 0
;SAR     : 每位右移, 低位进 CF, 高位不变

;它们的结果影响 OF、SF、ZF、PF、CF
;它们的指令格式相同:
SHL r/m, i8
SHL r/m, CL
--------------------------------------------------------------------------------

; Test24_1.asm
.386
.model flat, stdcall

include    windows.inc
include    kernel32.inc
include    masm32.inc
include    debug.inc
includelib kernel32.lib
includelib masm32.lib
includelib debug.lib

.code
main proc
    ;SHL、AL
    mov al, 11100111b
    shl al, 1
    PrintHex al ;CE - 11001110b
    sal al, 2
    PrintHex al ;38 - 00111000b
   
    mov al, 11100111b
    mov cl, 2
    shl al, cl
    PrintHex al ;9C - 10011100b
   
    ;SHR
    mov al, 11100111b
    shr al, 2
    PrintHex al ;39 - 00111001b
   
    ;SAR
    mov al, 11100111b
    sar al, 2
    PrintHex al ;F9 - 11111001b
    ret
main endp
end main
--------------------------------------------------------------------------------

ROL、ROR、RCL、RCR: 循环移位指令
--------------------------------------------------------------------------------


;ROL(Rotate Left):                循环左移
;ROR(Rotate Right):               循环右移
;RCL(Rotate through Carry Left):  带进位循环左移
;RCR(Rotate through Carry Right): 带进位循环右移

;ROL: 循环左移, 高位到低位并送 CF
;ROR: 循环右移, 低位到高位并送 CF
;RCL: 循环左移, 进位值(原CF)到低位, 高位进 CF
;RCR: 循环右移, 进位值(原CF)到高位, 低位进 CF

;它们的结果影响 OF、CF
;它们的指令格式相同:
SHL r/m, i8
SHL r/m, CL
--------------------------------------------------------------------------------

; Test24_2.asm
.386
.model flat, stdcall

include    windows.inc
include    kernel32.inc
include    masm32.inc
include    debug.inc
includelib kernel32.lib
includelib masm32.lib
includelib debug.lib

.code
main proc
    ;ROL
    mov al, 11000011b
    rol al, 1
    PrintHex al ;87 - 010000111b
   
    ;ROR
    mov al, 11000011b
    ror al, 1
    PrintHex al ;E1 - 11100001b
   
    ;RCL
    clc
    mov al, 10101111b
    rcl al, 1
    PrintHex al ;5E - 01011110b
   
    stc
    mov al, 10101111b
    rcl al, 1
    PrintHex al ;5F - 01011111b
   
    clc
    mov al, 10101111b
    rcl al, 2
    PrintHex al ;BD - 10111101b
   
    ;RCR
    clc
    mov al, 11101011b
    rcr al, 2
    PrintHex al ;BA - 10111010b
    ret
main endp
end main
--------------------------------------------------------------------------------

SHLD、SHRD: 双精度移位
--------------------------------------------------------------------------------


;SHLD(Double-Precision Shift Left):  双精度左移
;SHRD(Double-Precision Shift Right): 双精度右移

;SHLD 和 SHRD 有三个操作数
;操作数三: 是移位数目
;操作数一: 是目的操作数
;SHLD 左边被移出的位由操作数二相同数目的高位填充
;SHRD 右边被移出的位由操作数二相同数目的低位填充
;操作数二不变, 且须是寄存器

;它们的结果影响 OF、SF、ZF、PF、CF
;它们的指令格式相同:
SHLD r16/32/m16/m32, r16/32, i8
SHLD r16/32/m16/m32, r16/32, CL
--------------------------------------------------------------------------------

; Test25_3.asm
.386
.model flat, stdcall

include    windows.inc
include    kernel32.inc
include    masm32.inc
include    debug.inc
includelib kernel32.lib
includelib masm32.lib
includelib debug.lib

.code
main proc
    ;SHLD
    mov ax, 1100110011110000b
    mov dx, 1111111100000000b
    shld ax, dx, 2
    PrintHex ax ;33C3 - 0011001111000011b
   
    ;SHRD
    mov ax, 0000111100110011b
    mov dx, 0000000011111111b
    shrd ax, dx, 2
    PrintHex ax ;C3CC - 1100001111001100b
    ret
main endp
end main
转自:http://m.cnblogs.com/30694/1712490.html?full=1
分享到:
评论

相关推荐

    ALU.zip_ALU 实现减法_ALU和移位器_算术移位_算术逻辑单元_逻辑门

    有多种类型的移位:逻辑移位和算术移位。逻辑移位只是简单地将位向左或向右移动,空出的位用0填充。而算术移位则保留符号位,向左移位时高位填充原符号位,向右移位时低位填充原符号位,以保持数值的真值不变。 ...

    汇编实验2 实验二 算术逻辑运算及移位操作

    ### 汇编实验2 实验二 算术逻辑运算及移位操作 #### 实验目的 本实验旨在帮助学生深入理解并掌握汇编语言中的算术逻辑运算指令和移位指令的功能,并通过实际编程加深对标志寄存器各标志位意义的理解以及这些指令...

    数据传送指令与算术逻辑运算和移位指令的使用

    3. 移位指令分为算术逻辑移位(SHL/SHR/SAL/SAR)和循环移位(ROL/ROR/RCL/RCR)。移位操作可以用于位运算和数值的缩放。 实验中,学生通过编写和执行程序段,分析不同指令对AX、BX、CX和DX寄存器的影响,以及标志...

    了解4位函数发生器74LS181的组合功能,熟悉运算器执行算术操作和逻辑操作的具体实现过程

    了解 4 位函数发生器 74LS181 的组合功能,熟悉运算器执行算术...本实验对移位控制的功能和工作原理进行了深入的研究,掌握了移位寄存器 74LS299 的工作原理,并熟悉了运算器执行算术操作和逻辑操作的具体实现过程。

    cpu实验移位器

    本实验基于VHDL(Very High Speed Integrated Circuit Hardware Description Language)语言实现了一个全面的移位器,能够执行多种类型的移位操作,包括算术移位、逻辑移位以及循环移位。 1. **算术移位**: 算术...

    计算机组成带移位运算实验报告

    - (2) 如果扩展模型机以支持更多类型的移位操作(如逻辑移位),这将如何影响指令集和硬件设计? 通过这个实验,学生不仅能掌握计算机硬件级别的移位运算,还能提高分析和解决问题的能力,为后续深入学习计算机...

    C语言的移位操作

    关于C语言位操作,左移时总是移位和补零。右移时无符号数是移位和补零,此时称为逻辑右移;而有符号数大多数情况下是移位和补最左边的位(也就是补最高有效位),移几位就补几位,此时称为算术右移。

    VHDL语言 移位器

    在这个例子中,我们使用了VHDL的算术移位运算符`sll`(左移)、`sra`(算术右移)和`srl`(逻辑右移)来实现不同类型的移位操作。这个设计简单直观,但并不完善,例如没有处理非法的移位数量或者没有提供对循环移位...

    编程过程中常见移位操作

    位操作是指直接对整型或字符型变量中的每一位进行操作,这些操作包括但不限于位移、按位逻辑运算等。它们通常比传统的算术运算更快,因此在需要高性能计算的应用场景下被广泛采用。 #### 2. 二进制补码 补码是...

    微型计算机原理与接口技术:5逻辑运算和移位指令.ppt

    移位指令可以分为算术移位和逻辑移位两种。 * 算术移位:影响 CF 、 SF 、 ZF 和 PF * 逻辑移位:只影响 CF 和 OF 移位指令的常用用途包括: * 算术或逻辑左移 1 位可用于将无符号数乘以 2 * 算术右移 1 位可将有...

    计算机组成原理-移位运算.ppt

    移位操作按移位性质分为三种:逻辑移位、循环移位和算术移位。逻辑移位是整组数据移位,只有数字位置的变化,无数量的变化。循环移位是数据本身形成闭合环路。算术移位是带符号的数移位,符号不变、数量变化。 左移...

    4位算术逻辑单元(ALU)的设计

    LU的算数运算主要以加、减法为主,至于乘法、除法则可用“移位”配合“加法”的方法加以处理,即可完成运算。...最后,将算术单元电路和逻辑单元电路组合起来,成为功能完整的算术逻辑单元。具体框图如下图所示:

    深入理解计算机系统(第二版)-家庭作业答案

    函数 `int_shifts_are_arithmetic()` 判断了移位操作是否为算术移位。 3. 算术移位 算术移位是计算机系统中的一种基本操作。通过算术移位,可以实现对数值的移位操作。函数 `sra()` 和 `srl()` 实现了算术右移位和...

    汇编-第8课移位指令和串操作指令.pdf

    移位指令主要包括逻辑移位(SHL、SHR)、算术移位(SAL、SAR)以及循环移位(ROL、ROR、RCL、RCR)。 1. **逻辑移位**: - **SHL(逻辑左移)**:将操作数的位向左移动指定的次数,空出的高位用0填充,最低位移出...

    微型计算机原理与接口技术第3章8088指令系统4逻辑运算和移位指令.ppt

    "微型计算机原理与接口技术-...8088指令系统中的逻辑运算和移位指令是两个重要的概念,用于实现按位逻辑操作和数据的移位操作。它们有很多实用的应用,例如测试某个位是否为1、将某个寄存器清零、实现按位逻辑操作等。

    开放式CPU设计 实验程序 运算器部件实验:移位器

    移位操作可以分为逻辑移位和算术移位: 1. **逻辑移位**:在移位过程中,空出的位用0填充。无论原数据是正还是负,逻辑移位都只改变数值的二进制表示,不影响符号位。 2. **算术移位**:在处理带符号整数时,如果...

    Linux平台下C语言中的移位操作

    在 Linux 平台下,对于无符号整数的左移和右移操作,都是逻辑移位操作,也就是说,左移时最左边的位移掉了,最右边的移进来的位补零;右移时最右边的位移掉了,最左边移进来的位补零。例如,unsigned char x = 3; x ...

    实验4_桶形移位器1

    它允许数据按照特定的指令进行左移或右移,同时提供了多种类型的移位操作,包括算术移位和逻辑移位。桶形移位器通过控制输入来决定移位的方向、类型和位数,其核心是数据选择器(MUX)。 **实验原理**: 桶形移位器...

    cpu(移位器)

    2. 设计结构:根据移位类型(左移或右移)和是否是算术移位来选择合适的电路结构,可能包括移位寄存器、控制逻辑等。 3. 编写代码:使用VHDL语句描述电路的行为,例如使用进程(process)来描述时序逻辑,使用并行...

    算术与逻辑运算指令PPT学习教案.pptx

    算术与逻辑运算指令是计算机系统中最基本的操作单元,掌握这些知识点对于理解和应用计算机系统非常重要。本资源摘要信息旨在帮助学习者理解和掌握算术与逻辑运算指令的知识点,提高学习者的计算机知识和技能。

Global site tag (gtag.js) - Google Analytics