获取作为参数传递的字符
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 位
我想在 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
.