获取作为参数传递的字符

get a char passed as parameter

我想在 NASM System V ABI x86-64(英特尔语法)中编写一个可以在 C 程序中使用的函数。

函数原型如下:

char *rindex(const char *s, int c);

因此我按顺序检索参数 (const char *s = rdi, int c = rsi)

首先,我获取到寄存器rsi中存储的字符,并将其放入ah:

segment .text

global rindex:function

rindex:
    mov ah, byte [rsi] ;; get the character
    [...]

不幸的是,这一行使我的程序崩溃:

rindex("hello world", 'o') // segfault

为什么获取不到字符,正确的方法是什么?

我将第一个参数 (const char *s = rdi) 称为“char”,因为它是指向 char 的指针。您的第二个参数 (int c = rsi) 是一个 int。要访问 s 指向的字符串的元素,您可以使用 mov ah, byte ptr [rdi]。但是你的第二个参数不是指针,rsi包含c的值。要阅读它,您可以从 esi 读取,因为 int 的值适合 rsi.

的低 32 位