【发布时间】:2021-01-25 14:17:07
【问题描述】:
我正在尝试学习一些程序集(intel 语法,x86_64)。 我写了这段代码来做一个简单的 strcmp() 实现:
section .text
global ft_strcmp
ft_strcmp:
cmp byte [rsi], 0
je exit
mov cl, byte [rsi]
cmp byte [rdi], cl
jne exit
inc rsi
inc rdi
jmp ft_strcmp
exit:
xor rax, rax
mov al, [rdi]
sub al, byte [rsi]
ret
但是通过调用 ft_strcmp("Hello", "Hellooooo") 来尝试返回 145,而真正的 strcmp() 返回 -1,我似乎不知道为什么。 我的语法错了吗,还是我尝试这样做的方式?
【问题讨论】:
-
除了第一次检查字符串结尾(达到 NUL 字节)外,您正在操作 qwords(8 个字节)。在比较和返回差异时,您还需要对字节进行操作。它可能不会返回 0,但您可能只打印结果的低 32 位。
-
感谢@user786653,这让我走上了更好的道路。我相应地编辑了我的问题,但结果还不正确。我猜这是因为一个字节可以存储从 0 到 255 的值,而负值会导致它循环。如何在仍然处理 1 个字节的同时保留返回值的符号?
-
您需要返回带符号的 32 位结果,因此将两个字节零扩展为 32 位正整数,然后执行 32 位减法。
exit: movzx eax, byte [rdi] ; movzx ecx, byte [rsi] ; sub eax, ecx. -
感谢@NateEldredge,这就是我正在寻找的解决方案! movzx 不是我使用的文档中列出的操作数,但是查找它,这一切都有意义。抱歉,我是 stackoverflow 的新手,我不知道如何将您的评论标记为正确答案...