我正在尝试理解Intel x64语法下NASM汇编的基本概念,但在尝试创建strchr等效函数时遇到了问题...
我已经在网上搜索了尽可能多的信息,但我不知道如何将字符串的当前字符(例如str[i])与一个简单的字符进行比较。
这是测试主函数:
#include <stdio.h>
extern char* my_strchr(char*, char);
int main(void)
{
char* str;
str = my_strchr("foobar", 'b');
printf("%s\n", str);
return 0;
}
以下是我的汇编代码:
我假设 rdi 是我的字符串,rsi 是一个字节的数据。
my_strchr:
push rcx ;Save our counter
xor rcx, rcx ;Set it to 0
loop:
cmp rdi, byte 0 ;Check the end of string
jz end
cmp rsi, [byte rdi+rcx] ;Here is the point ...
jz end
inc rcx ;increment our counter
jmp loop
end:
mov rax, [rdi+rcx] ;Are the brackets needed ? Is it equivalent to '&' in C ?
pop rcx
ret
以下是针对用 C 语言编写的 strchr 函数的 Gdb 输出和反汇编结果:
....
cmp al,BYTE PTR [rbp-0x1c]
....
但是我的实际情况是这样的:
0x400550 <my_strchr> push rcx
0x400551 <my_strchr+1> xor rcx,rcx
0x400554 <loop> cmp rdi,0x0
0x400558 <loop+4> je 0x400566 <end>
0x40055a <loop+6> cmp rsi,QWORD PTR [rdi+rcx*1+0x0]
提前感谢您,希望有人能知道。
lea
对于寻址或一些简单的算术运算非常有用。您也可以使用mov rax, rdi; add rax, rcx
来实现相同的效果。 - Jester