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.