移位操作有很多种,一般知道算术移位操作(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
分享到:
相关推荐
汇编实验2 汇编语言程序设计的实验环境及上机步骤 实验二 算术逻辑运算及移位操作
算术逻辑单元,可以实现加法、减法、比较、移位、与门、或门等功能
关于C语言位操作,左移时总是移位和补零。右移时无符号数是移位和补零,此时称为逻辑右移;而有符号数大多数情况下是移位和补最左边的位(也就是补最高有效位),移几位就补几位,此时称为算术右移。
一。 把数据、地址或立即数传送到寄存器、存储单元以及I/O端口,或从... 二 使用算术逻辑运算和移位指令,可以实现对二进制数据的加、减、乘、除等四则运算,与、或、非、异或等逻辑运算,以及移位运算和代码转换运算
本程序主要是面向VHDL语言的初学者,本程序包括算术移位、逻辑移位、循环移位。不是很完美,请多多指教!!
LU的算数运算主要以加、减法为主,至于乘法、除法则可用“移位”配合“加法”的方法加以处理,即可完成运算。...最后,将算术单元电路和逻辑单元电路组合起来,成为功能完整的算术逻辑单元。具体框图如下图所示:
ALU需要实现对应的加减、逻辑运算、移位、比较等功能并采用仿真软件设计和对软件进行调试。 1.2 总体设计 1.2.1 总体设计原理 ALU是一种功能较强的组合逻辑电路,它能进行多种算术运算和逻辑运算。ALU给出运算结果的...
关于逻辑移位、算术移位可参见迅雷深大笔试题部分。的一道题。 以前看到C++标准上说,移位运算符(<<、>>)出界时的行为并不确定: The behavior is undefined if the right operand is negative, orgreater ...
2.了解4位函数发生器74LS181的组合功能,熟悉运算器执行算术操作和逻辑操作的具体实现过程; 3.验证带进位控制的74LS181的功能。 二、实验设备: EL-JY-II型计算机组成原理实验系统一套,排线若干。
用vhdl编写的移位器,实现了算术左移何右移,逻辑左移和右移,循环左移和右移。
ALU的算数运算主要以加、减法为主,至于乘法、除法则可用“移位”配合“加法”的方法加以处理,即可完成运算。虽然逻辑运算的种类很多,但实际上ALU中的逻辑电路单元通常只处理AND、OR、XOR、NOT这四种运算,其它的...
用vhdl实现的,可以实现算术左移,右移,循环左移右移,逻辑左移右移,有详细注释。
Java运算符主要分为四类:算术运算符、关系运算符、逻辑运算符和位运算符,这些运算符用于实现不同的数学和逻辑功能。 算术运算符介绍 算术运算符包括加、减、乘、除和取余等基本运算,它们可以对整数、浮点数和字节...
算术移位指令有:算术左移SAL(ShiftAlgebraic Left)和算术右移SAR(ShiftAlgebraic Right)。算术移位指令的功能描述如下: (1)算术左移SAL把目的操作数的低位向高位移,空出的低位补0; (2)算术右移SAR把目的操作...
华中科技大学计算机组成原理实验二运算器实验Logisim源文件,里面有8位可控加减法器设计、32位算术逻辑运算单元ALU设计、四位先行进位74182、四位快速加法器 、8位快速加法器、16位快速加法器、5位阵列乘法、6位补码...
具有算术和逻辑单元(例如加法器,计数器,lfsr,移位器和通用alu模块)的VHDL设计存储库。 目录 hdl/包含用于FPGA设计和测试平台的VHDL源。 list/包含* .lst文件,其中包含要编译的源路径。 用于Aldec Riviera-...
昨天看了一本书,使用乘法器来实现各种移位操作。包括逻辑左移,逻辑右移,算术右移,循环右移。
MIPS-and-Verilog-Calculator:使用MIPS汇编语言创建了一个可以支持加,减,乘和除的计算器。 还使用Verilog硬件描述语言创建了一个单独的计算器,可以执行基本的算术,逻辑和移位运算
本实验中的ALU要求实现基本的算术运算、逻辑运算、移位运算等,具体功能如下: "操作码 "功能 "描述 " "ADD "A+B "加法 " "SUB "A-B "减法 " "AND "A and B "与 " "OR "A or B "或 " "XOR "A xor B "异或 " "NOT ...
4 . 1 寄存器 4 . 2 移位寄存器 4 . 3 实验内容 4 . 3 . 1 算术移位和逻辑移位寄存器