2012-03-20 44 views
1

我在组装一个问题所困扰,在这里我必须采取的十六进制代码的第一个字节(FF):复制两个字节到整个寄存器

0x045893FF and copy it over the entire hex code: 

0xFFFFFFFF. 

我所做的是:

movl $0x04580393FF, %eax 
shl $24, %eax  # to get only the last byte 0xFF000000 

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

如何做到这一点?谢谢!

+0

你的系统真的有4位字节吗?你使用'%eax',这让我想到x86(它有8位字节),但你说'FF'是两个字节。 – 2012-03-20 00:14:12

+0

'FF'是一个字节,而不是两个。你是什​​么意思? – 2012-03-20 00:14:17

+0

@Carl:没有规则说明一个字节必须有8位:) http://en.wikipedia.org/wiki/Octet_(computing) – 2012-03-20 00:15:09

回答

3

你可以做到这一点,例如像这样:

mov %al, %ah #0x0458FFFF 
mov %ax, %bx #0xFFFF 
shl $16, %eax #0xFFFF0000 
mov %bx, %ax #0xFFFFFFFF 

另一种方法是:

movzx %al, %eax 
imul $0x1010101, %eax 

最后一个可能是较快的现代建筑。

+0

伟大的答案,这正是我一直在寻找!非常感谢 – juliensaad 2012-03-20 00:43:57

+0

为什么'movsx%al,%eax' - 毕竟,0xff被视为signed,将直接扩展为'0xffffffff'。不需要“通过乘法复制字节”技巧。 – 2012-03-20 17:30:09

+0

同意,虽然这当然这只适用于'0xff'字节的特殊情况。 – 2012-03-20 17:31:26

1

我习惯了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 
0

使用一个寄存器(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) 

这比上述溶液慢一点,虽然。