x86汇编_SHLD/SHRD双精度左右移指令_笔记49

SHLD(双精度左移)指令将目的操作数向左移动指定位数。移动形成的空位由源操作数的高位填充。SHRD(双精度右移)指令将目的操作数向右移动指定位数。移动形成的空位由源操作数的低位填充。源操作数不变,但是符号标志位、零标志位、辅助进位标志位、奇偶标志位和进位标志位会受影响。

下图展示的是 SHLD 执行移动两位的过程。源操作数的最高位复制到目的操作数的最低位上。目的操作数的所有位都向左移动:

下图展示的是 SHRD 执行移动两位的过程:

目标操作数可以是寄存器或内存操作数,源操作数必须是寄存器,移位次数可以是 CL 寄存器或者 8 位立即数,格式如下:

SHLD 16位寄存器,16位寄存器,cl寄存器或者8位立即数
SHLD 16位内存数,16位寄存器,cl寄存器或者8位立即数
SHLD 32位寄存器,32位寄存器,cl寄存器或者8位立即数
SHLD 32位内存数,32位寄存器,cl寄存器或者8位立即数

下面的代码示例展示了用 SHRD 如何将一个双字数组右移 4 位:

.data
array DWORD 648B2165h, 8C943A29h, 6DFA4B86h, 91F76C04h, 8BAF9857h

.code
main PROC
    nop
    mov esi, OFFSET array
    mov ecx, (LENGTHOF array) - 1
L1: mov eax, [esi + TYPE DWORD]
    shrd [esi], eax, 4
    add esi, TYPE DWORD
    loop L1
    shr DWORD PTR [esi], 4
    invoke ExitProcess,0
main ENDP

end main

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值