我从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
之后。
答案 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=0010。 memcmp
可能返回非零值,如512,但系统会将其截断为0。