Wednesday 13 February 2019

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



I need to write a pixelization assembly code ONLY using %rax, %rbx, %rcx, %rdx, %rsi, and %rdi (also %rsp and %rbp)



So I've first wrote code in C and changed any other registers into 64 bit registers, but at the point below when I change the register it gives Segmentation default



C code:



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


Assembly code By 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)


Changed %dl to %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)

Answer



I think you want to do something like:



 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;


You should be able to write this with 64bit regs only. You should also be able to find a whole bunch of ways to make this way smaller than this.


No comments:

Post a Comment

php - file_get_contents shows unexpected output while reading a file

I want to output an inline jpg image as a base64 encoded string, however when I do this : $contents = file_get_contents($filename); print &q...