I try to learn amd64 assembler. This is the first thing I tried. This piece of assembly should replicate the functionality of the following piece of C code, which turns a binary sha-256 hash into a human readable form.assembly code1:  .ascii 0123456789abcdef    .global show_hashshow_hash:    .type show_hash @function    .func show_hash    mov $32,%ecx    .p2align 20:  xor %eax,%eax    lodsb    mov %eax,%edx    shr $4,%al    and $15,%dl    mov 1b(%rax),%al    mov 1b(%rdx),%dl    mov %bl,%ah    stosw    dec %ecx    jnz 0b    mov %cl,(%rdi)    ret    .endfuncC codevoid show_hash(char *dst, unsigned char *src) {  static const char *lookup = 0123456789abcdef;  char lo, hi, byte;  int i = 32;  do {    byte = *src++;    hi = lookup[byte >> 4];    lo = lookup[byte & 0xf];    *dst++ = hi;    *dst++ = lo;  } while (i--);}Am I doing it right? I tried to move the lookup table (label 1) into .section rodata, but all references to it were changed to 0 in the linked program, so I put it into the text section for now.
First steps with amd64 assembly
linux;assembly;lookup
I'm not sure whether it's correct:If show_hash uses cdecl calling conventions you should preserve registers like %bl, and read the input parameter values from the stack into esi and edi.(see section 3.2.3 Parameter Passing of the Application Binary Interface: parameters are conveniently passed in the rdi and rsi registers)I don't understand the syntax of mov 1b(%rax),%al: is it reading from the lookup array defined at label 1:? On re-reading, I think it is; however that will only work if the most-significant bytes of rax and rdx are all zero; perhaps you should initialize them as you did using xor %eax,%eax(apparently xor %eax,%eax will clear the whole of %rax)You're using stosw which writes two bytes (two ASCII characters) a time; but %ah contains  a value from %bl, and %bl wasn't previously initialized? I think that statement should have been mov %dl,%ah not mov %bl,%ah; or perhaps you could have done mov 1b(%rdx),%ah directly.The function ends with mov %cl,(%rdi) to null-terminate the string; that is clever but could use a comment (it took me a bit to figure out). Most of the assembly questions either have good comments, or answer which say that they should have good comments.