关于汇编:如何仅使用64位寄存器将1字节值存储在64位寄存器中?

How can I store 1byte value in 64bit register only using 64bit registers?

我只需要使用%rax、%rbx、%rcx、%rdx、%rsi和%rdi(还有%rsp和%rbp)编写像素化程序集代码。

因此,我首先用C语言编写代码,并将其他寄存器改为64位寄存器,但是在下面的一点上,当我更改寄存器时,它会给出分段默认值。

C代码:

1
2
3
*temp = b;
*(temp + 1) = g;  
*(temp + 2) = r;

GCC汇编代码:

1
2
3
4
5
6
7
8
9
10
11
12
movq    -48(%rbp), %rax  
movl    %eax, %edx
movq    -16(%rbp), %rax  
movb    %dl, (%rax)      
movq    -16(%rbp), %rax  
addq    $1, %rax
movq    -56(%rbp), %rdx  
movb    %dl, (%rax)
movq    -16(%rbp), %rax
addq    $2, %rax
movq    -64(%rbp), %rdx  
movb    %dl, (%rax)

已将%dL更改为%rdx:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
movq    -16(%rbp), %rax
movq    -48(%rbp), %rdx
movzbq  (%rdx), %rbx
movq    %rbx, (%rax)
movq    -16(%rbp), %rax
addq    $1, %rax
movq    -56(%rbp), %rdx
movzbq  (%rdx), %rbx
movq    %rbx, (%rax)
movq    -16(%rbp), %rax
addq    $2, %rax
movq    -64(%rbp), %rdx
movzbq  (%rdx), %rbx
movq    %rbx, (%rax)


我想你想做点什么:

1
2
3
4
5
6
7
8
9
 t = r & 0xff;
 u = *temp & ~ 0xfful;
 *temp = u | t;
 t = (g & 0xff) << 8;
 u = *temp & ~ 0xff00ul;
 *temp = u | t;
 t  = (b & 0xff) << 16;
 u = *temp & ~0xff00000ull;
 *temp = u | t;

您应该只能用64位regs编写这个命令。你也应该能找到很多方法来让这个方法比这个小。