如何仅使用64位寄存器在64位寄存器中存储1字节值



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

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

C代码:

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

汇编代码通过gcc:

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:

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)

我想你想做一些类似的事情:

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来写这个。你还应该能够找到一大堆方法,让这个比这个小。

最新更新