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