Как я могу хранить 1-байтовое значение в 64-битном регистре только с использованием 64-битных регистров? - PullRequest
0 голосов
/ 18 ноября 2018

Мне нужно написать код сборки пикселизации ТОЛЬКО с использованием% rax,% rbx,% rcx,% rdx,% rsi и% rdi (также% rsp и% rbp)

Итак, я сначала написал код на C и изменил любые другие регистры на 64-битные регистры, но в точке ниже, когда я изменяю регистр, это дает Сегментацию по умолчанию

код 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)

1 Ответ

0 голосов
/ 20 ноября 2018

Я думаю, вы хотите сделать что-то вроде:

 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-битными регистрами.Вы также должны быть в состоянии найти целую кучу способов сделать этот путь меньше, чем этот.

...