我正试图在汇编语言中实现自己的strcmp函数。以下是ft_strcmp.s文件内容:
global ft_strcmp
section .text
ft_strcmp:
mov eax, [rdi]
sub eax, [rsi]
jne .exit
cmp byte [rdi], 0 ; if s1 end
je .exit
cmp byte [rsi], 0 ; if s2 end
je .exit
inc rdi
inc rsi
jmp ft_strcmp
.exit:
ret
第一个字母的比较没有问题: char *s1 = "Hello World" char *s2 = "Jdllo World" 结果为1。(0000 0001)
问题在于当我尝试比较这些字符串时:
char *s1 = "Hello World"
char *s2 = "Hdllo World"
RAX中的结果不是1,而是256。(0000 0001 0000 0000)
另一个例子:
char *s1 = "Hello World"
char *s2 = "Hcllo World"
RAX中的结果不是2,而是512。(0000 0010 0000 0000)
正如你已经理解的那样,第三个不同字母的结果将是:
char *s1 = "Hello World"
char *s2 = "Heklo World"
RAX中的结果不是1,而是65536。(0000 0001 0000 0000 0000 0000)
我意识到RAX的递增不正确,但我找不到代码中的错误。 所以我请求您帮助我理解。
eax
从内存中加载并减去32位的值。除了您看到的结果之外,您还有可能超过空字符终止符。只是因为字符串长度加上空字符终止符都是(4)
的倍数,而且测试没有使用'Hello Worle'
这样的字符串。使用al
- 即eax
的最低有效字节 - 可以解决这个问题,但接下来需要将al
进行符号扩展,以获得完整的64位rax
返回值。 - Brett Hale'int'
返回值,您只需要将符号扩展到32位eax
值即可。 - Brett Hale