I would like to write a function in NASM System V ABI x86-64 (Intel Syntax) that I could use in a C program.
Here is the prototype of the function:
char *rindex(const char *s, int c);
I therefore retrieve the parameters in order (const char *s = rdi, int c = rsi)
First, I get the character stored in the register rsi and put it in ah:
segment .text
global rindex:function
rindex:
mov ah, byte [rsi] ;; get the character
[...]
Unfortunately, this line crashes my program:
rindex("hello world", 'o') // segfault
Why it is impossible to get the char and what would be the correct way?
Advertisement
Answer
I call “char” your first argument (const char *s = rdi), since it is a pointer to char. Your second argument (int c = rsi) is an int. To access elements of the string pointed by s you can use mov ah, byte ptr [rdi]. But your second argument is not a pointer, rsi contains the value of c. To read it you can read from esi, since the value of an int fits in the lower 32-bits of rsi.