patternMinor
First steps with amd64 assembly
Viewed 0 times
withamd64assemblyfirststeps
Problem
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 code
C code
Am I doing it right? I tried to move the lookup table (label
assembly code
1: .ascii "0123456789abcdef"
.global show_hash
show_hash:
.type show_hash @function
.func show_hash
mov $32,%ecx
.p2align 2
0: 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 code
void 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.Solution
I'm not sure whether it's correct:
(see section "3.2.3 Parameter Passing" of the Application Binary Interface: parameters are conveniently passed in the rdi and rsi registers)
(apparently
- If
show_hashuses 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 thelookuparray defined at label1:? 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 usingxor %eax,%eax
(apparently
xor %eax,%eax will clear the whole of %rax)- You're using
stoswwhich writes two bytes (two ASCII characters) a time; but%ahcontains a value from%bl, and%blwasn't previously initialized? I think that statement should have beenmov %dl,%ahnotmov %bl,%ah; or perhaps you could have donemov 1b(%rdx),%ahdirectly.
- 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.
Context
StackExchange Code Review Q#11110, answer score: 3
Revisions (0)
No revisions yet.