向整数寄存器的每个位置重复/广播一个字节

jul*_*aad 2 x86 assembly bit-manipulation

我正在努力解决汇编中的问题,我必须获取十六进制代码的第一个字节 (FF) 并将其复制到整个值上:

0x045893FF      input
0xFFFFFFFF      output
Run Code Online (Sandbox Code Playgroud)

我所做的是:

movl $0x04580393FF, %eax
shl $24, %eax     # to get only the last byte 0xFF000000
Run Code Online (Sandbox Code Playgroud)

现在我想将此字节复制到寄存器的其余部分。

Gun*_*iez 5

例如,您可以这样做:

mov %al, %ah    #0x0458FFFF
mov %ax, %bx    #0xFFFF
shl $16, %eax   #0xFFFF0000
mov %bx, %ax    #0xFFFFFFFF
Run Code Online (Sandbox Code Playgroud)

另一种方法是:

movzx %al, %eax
imul $0x1010101, %eax
Run Code Online (Sandbox Code Playgroud)

最后一个在现代架构上可能更快。