memcmp忽略奇数位置的字符

rea*_*eal 4 assembly x86-64 fasm

memcmp从fasm(版本1.71.51)代码调用,我得到了奇怪的结果.

似乎memcmp只比较处于奇数位置的字符.码:

format ELF64

section '.text' executable

    public _start

    extrn memcmp
    extrn exit

_start:
    push    rbp     ; Align the stack to 16 bytes

    mov     rdi, str1
    mov     rsi, str2
    mov     rdx, BUFF_LEN
    call    memcmp

    mov     rdi, rax
    call    exit
    pop     rbp


section '.data' writeable

str1                db '1509487271'
BUFF_LEN = $ - str1
str2                db '1509487273'
Run Code Online (Sandbox Code Playgroud)

我正在运行Ubuntu:

$ uname -a
Linux freedom 4.13.0-43-generic #48~16.04.1-Ubuntu SMP Thu May 17 12:56:46 UTC 2018 x86_64 x86_64 x86_64 GNU/Linux
Run Code Online (Sandbox Code Playgroud)

要组装和运行上面的代码,我使用以下命令:

$ fasm strange_memcmp.asm && ld -dynamic-linker /lib64/ld-linux-x86-64.so.2 -lc -melf_x86_64 strange_memcmp.o -o strange_memcmp.out && ./strange_memcmp.out 
flat assembler  version 1.71.51  (16384 kilobytes memory)
3 passes, 803 bytes.
$ echo $?
0
Run Code Online (Sandbox Code Playgroud)

我希望它memcmp会返回一个不是的值0,因为缓冲区是不同的.

我试过改变两个缓冲区.如果我设置:

str1 = '2509487271'
str2 = '1509487273'
Run Code Online (Sandbox Code Playgroud)

我获得了1的返回值.

如果我设置:

str1 = '1409487271'
str2 = '1509487273'
Run Code Online (Sandbox Code Playgroud)

我获得的返回值为0.看起来memcmp只关心偶数位置的字符:0,2,4 ......等.

我有一种奇怪的感觉,我错误地调用了memcmp.这可能与Linux x64 abi有关,但我无法找出可能出现的问题.任何想法都表示赞赏!

编辑:根据雷蒙德的回答,该过程的返回值是用掩码.

为了修复上面的代码,我添加了两条指令:

neg     rax
sbb     rax, rax
Run Code Online (Sandbox Code Playgroud)

在电话会议结束后memcmp.

Ray*_*hen 7

您正在将memcmp直接返回的64位值传递给exit,但0377返回到父级之前,该值为AND.memcmp可能返回非零值,如512,但系统将其截断为0.