X86嵌入式汇编,访问寄存器的特定部分

时间:2010-11-11 20:20:54

标签: assembly x86 inline-assembly

我有一个值为0x01ABCDEF(十六进制值)的寄存器ecx 我想访问BYTE 2(AB)以便对其执行操作。 我尝试过使用cl或ch但是那些没有访问正确的字节。 我试过了:

mov bh, [ecx+2]

但它只是错误... 谢谢您的时间和帮助!

1 个答案:

答案 0 :(得分:2)

是的 - CL将为您提供EF,CH会根据您上面给出的值给您CD。既然你不想要那些,那么你必须做一个转换才能将字节放在正确的位置:

mov ebx, ecx
shr ebx, 8

现在BH将拥有AB,BL将拥有CD

编辑:从您的评论中,您显然并不需要BH中的值 - 相反,您只想操纵该特定字节而不影响ECX的其余部分。在这种情况下,做这样的事情可能最容易:

ror ecx, 16
not cl    // placeholder for the manipulation
rol ecx, 16

这只是旋转ECX所以我们关心的字节在CL中,然后操纵CL,然后旋转ECX,这样字节就是它们开始的地方。我应该补充一点,虽然这很简单,但在某些处理器上它会很慢。 Pentium IV没有桶形移位器,因此旋转需要的时间与移动的位数成比例。更糟糕的是,操纵CL然后使用ECX可以(在这种情况下可能会)导致Partial Register Stall。这对你来说是否重要取决于你要用这个来完成什么,以及它是否会被PRS期间可以执行的其他指令所包围。