C 如何在x86 64程序集中正确地减去值
我正在尝试使用assembly实现strcmp,我不理解返回值为何不符合预期:C 如何在x86 64程序集中正确地减去值,c,assembly,x86-64,nasm,C,Assembly,X86 64,Nasm,我正在尝试使用assembly实现strcmp,我不理解返回值为何不符合预期: global _ft_strcmp section .text _ft_strcmp: cmp [rdi], byte 0 je _done cmp [rsi], byte 0 je _done cmpsb je _ft_strcmp _done: dec rdi dec rsi
global _ft_strcmp
section .text
_ft_strcmp:
cmp [rdi], byte 0
je _done
cmp [rsi], byte 0
je _done
cmpsb
je _ft_strcmp
_done:
dec rdi
dec rsi
xor rax, rax
mov rax , [rdi]
sub rax , [rsi]
ret
我正在使用下面的C代码进行测试:
int ft_strcmp(char *s1, char *s2);
int main()
{
char *x = "A";
char *y = "B";
printf("%i %i", ft_strcmp(x, y), strcmp(x, y));
}
输出为:-1759707137-1
它看起来像是一个下溢,但我不确定。你希望
mov-rax,[rdi]
做什么?@SamiKuhmonen将rdi指向的字符的ascii值存储在raxrax
是一个64位寄存器中,因此它将使用mov
,而不是8bit255是-1的无符号版本。用AL计算,然后符号扩展到RAX为什么不将原始strcmp生成的代码和您的代码进行比较?