Assembly 打包和检索打包位字段

Assembly 打包和检索打包位字段,assembly,x86,bit-manipulation,bit-fields,Assembly,X86,Bit Manipulation,Bit Fields,我感兴趣的是,建议的方法是打包一个值,然后再次检索该打包值 我认为从内存地址执行此操作(如果我理解正确的话)很简单,因为可以根据内存偏移量检索值。这是正确的,还是比这更复杂 对于尝试将两个16位值打包到寄存器中,我有以下内容: mov $72, %ax # low 2-bytes (of eax) or $(19 << 16), %eax # high 2 bytes (of eax) mov %eax, %ebx and $0x0000FFFF, %

我感兴趣的是,建议的方法是打包一个值,然后再次检索该打包值

我认为从内存地址执行此操作(如果我理解正确的话)很简单,因为可以根据内存偏移量检索值。这是正确的,还是比这更复杂

对于尝试将两个16位值打包到寄存器中,我有以下内容:

mov $72, %ax            # low 2-bytes  (of eax)
or $(19 << 16), %eax    # high 2 bytes (of eax)

mov %eax, %ebx
and $0x0000FFFF, %ebx # low bits go in ebx
mov %eax, %ecx

and $0xFFFF0000, %ecx # high bits go in ecx
shr $16, %ecx

您不需要将要移位的位归零。对于2N位整数中的一对N位值,解包的惯用方法是
high=x>>16
/
low=x&0xFFFF
。当然,对于x86,当位字段宽度为1、2或4字节时,扩展名为零的mov可以代替
。e、 g.
movzwl%ax,%ecx
。和往常一样,查看编译器输出以查找您错过的优化。此外,您的初始化在RAX的上半部分留下了潜在的垃圾,因为
mov$72,%ax
未修改这些字节。
mov %eax, %ebx
and $0x0000FFFF, %ebx