gpt4 book ai didi

linux - 如何将字符串中的一个字符与 NASM x86_64 Linux 程序集中的另一个字符进行比较

转载 作者:太空狗 更新时间:2023-10-29 12:28:05 27 4
gpt4 key购买 nike

我实际上是在尝试理解 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

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 没有任何意义,因为您正在比较整个 rsi这是8个字节。那应该是 cmp sil, [rdi + rcx]

最后,strchr 应该返回一个指针,因此您应该将 mov rax, [rdi+rcx] 更改为 lea rax, [rdi + rcx]

关于linux - 如何将字符串中的一个字符与 NASM x86_64 Linux 程序集中的另一个字符进行比较,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35927302/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com