memcmp忽略奇数位置的字符

时间:2018-06-16 16:40:21

标签: assembly x86-64 fasm

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

似乎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'

我正在运行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

要汇编并运行上面的代码,我使用以下命令:

$ 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

我希望memcmp返回的值不是0,因为缓冲区不同。

我尝试更改两个缓冲区。如果我设置:

str1 = '2509487271'
str2 = '1509487273'

我获得了1的返回值。

如果我设置:

str1 = '1409487271'
str2 = '1509487273'

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

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

编辑:根据Raymond的回答,该过程的返回值是用掩码进行的。

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

neg     rax
sbb     rax, rax
在致电memcmp之后

1 个答案:

答案 0 :(得分:6)

您将从 $(document).ready(function () { $("#CC").change(function () { $("#CustomerId").empty(); $.ajax({ type: 'POST', url: '@Url.Action("GetCustomersByCC")', dataType: 'json', data: { id: $("#CC").val() }, success: function (states) { $.each(states, function (i, CustomerId) { $("#CustomerId").append('<option value="' + CustomerId.Value + '">' + CustomerId.Text + '</option>'); }); }, error: function (ex) { alert('Error getting cost centers' + ex); } }); return false; }) }); 返回的64位值直接传递给 @model List<FlexCart.Data.Context.OrderItem> @for (int i = 0; i < Model.Count(); i++) { @Html.DropDownListFor(model => model[i].CCId, IEnumerable<SelectListItem>)ViewBag.CCIds, htmlAttributes: new { id = "CC", @class = "form--control"}) @Html.DropDownListFor(model => model[0].CustomerId, new SelectList(string.Empty, "Value", "Text"), htmlAttributes: new { id = "CustomerId", @class = "form-control"}) } ,但是https://codepen.io/ulrichdohou/pen/ERbYRX?editors=0010memcmp可能返回非零值,如512,但系统会将其截断为0。