我在组装一个问题所困扰,在这里我必须采取的十六进制代码的第一个字节(FF):复制两个字节到整个寄存器
0x045893FF and copy it over the entire hex code:
0xFFFFFFFF.
我所做的是:
movl $0x04580393FF, %eax
shl $24, %eax # to get only the last byte 0xFF000000
现在我想将这个字节复制到寄存器的其余部分。
如何做到这一点?谢谢!
我在组装一个问题所困扰,在这里我必须采取的十六进制代码的第一个字节(FF):复制两个字节到整个寄存器
0x045893FF and copy it over the entire hex code:
0xFFFFFFFF.
我所做的是:
movl $0x04580393FF, %eax
shl $24, %eax # to get only the last byte 0xFF000000
现在我想将这个字节复制到寄存器的其余部分。
如何做到这一点?谢谢!
你可以做到这一点,例如像这样:
mov %al, %ah #0x0458FFFF
mov %ax, %bx #0xFFFF
shl $16, %eax #0xFFFF0000
mov %bx, %ax #0xFFFFFFFF
另一种方法是:
movzx %al, %eax
imul $0x1010101, %eax
最后一个可能是较快的现代建筑。
伟大的答案,这正是我一直在寻找!非常感谢 – juliensaad 2012-03-20 00:43:57
为什么'movsx%al,%eax' - 毕竟,0xff被视为signed,将直接扩展为'0xffffffff'。不需要“通过乘法复制字节”技巧。 – 2012-03-20 17:30:09
同意,虽然这当然这只适用于'0xff'字节的特殊情况。 – 2012-03-20 17:31:26
我习惯了NASM汇编语法,但这应该相当简单。
; this is a comment btw
mov eax, 0x045893FF ; mov to, from
mov ah, al
mov bx, ax
shl eax, 16
mov ax, bx
; eax = 0xFFFFFFFF
使用一个寄存器(EAX)另一种解决方案只:
(reg=dcba)
mov ah, al (reg=dcaa)
ror eax, 8 (reg=adca)
mov ah, al (reg=adaa)
ror eax, 8 (reg=aada)
mov ah, al (reg=aaaa)
这比上述溶液慢一点,虽然。
你的系统真的有4位字节吗?你使用'%eax',这让我想到x86(它有8位字节),但你说'FF'是两个字节。 – 2012-03-20 00:14:12
'FF'是一个字节,而不是两个。你是什么意思? – 2012-03-20 00:14:17
@Carl:没有规则说明一个字节必须有8位:) http://en.wikipedia.org/wiki/Octet_(computing) – 2012-03-20 00:15:09