如何比较string中的字符与NASM x86_64 Linux程序集中的另一个字符

实际上,我试图理解英特尔x64语法中的NASM汇编的基本概念,但在尝试创build相当于strchr的同时面临一个问题。

我一直在航行networking获取最大的信息,但我不明白如何比较当前string(如str [我])与一个简单的字符。

这里是testing主要:

#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是我的string,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 

GDB给了我这个输出为c编写的strchr函数,因此反汇编:

 .... 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] 

预先感谢你,希望有人知道

rdi是一个指针,所以cmp rdi, 0检查一个空指针。 你的意思是cmp byte [rdi + rcx], 0来检查字符串的结尾。 注意你需要检查当前字符,所以必须添加索引显然。

至于cmp rsi, [byte rdi+rcx]这个byte是没有意义的,因为你正在比较整个8字节的rsi 。 这应该是cmp sil, [rdi + rcx]

最后, strchr应该返回一个指针,所以你应该把mov rax, [rdi+rcx] lea rax, [rdi + rcx]