Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/72.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 如何在x86 64程序集中正确地减去值_C_Assembly_X86 64_Nasm - Fatal编程技术网

C 如何在x86 64程序集中正确地减去值

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

我正在尝试使用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
    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值存储在rax
rax
是一个64位寄存器中,因此它将使用
mov
,而不是8bit255是-1的无符号版本。用AL计算,然后符号扩展到RAX为什么不将原始strcmp生成的代码和您的代码进行比较?