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编写这个命令。你也应该能找到很多方法来让这个方法比这个小。