【发布时间】:2020-10-20 18:45:03
【问题描述】:
我正在使用内联 C 程序集,但我不明白为什么 cmp 命令在这两种情况下不起作用。
我有 C 函数:
int array_max(const int input_array[], const int array_size);
在main中我创建了数组并将其传递给函数
int input_array[] = {50,10,3,70,5};
printf("%d\n", array_max(input_array, 5));
函数定义写在汇编中
__asm__
(
"array_max:;"
" xor %rdx, %rdx;"
" movq $70, %rax;"
" movq $50, %rbx;"
" cmp %rbx, %rax;"
" jge gr_eq;"
" movq %rbx, %rax;"
"gr_eq:;"
" ret"
);
在这种情况下是返回值 70
__asm__
(
"array_max:;"
" xor %rdx, %rdx;"
" movq $70, %rax;"
" movq (%rdi,%rdx,4), %rbx;" // input_array[0] == 50
" cmp %rbx, %rax;"
" jge gr_eq;"
" movq %rbx, %rax;"
"gr_eq:;"
" ret"
);
但这种情况下 50...
sameone 可以帮助我如何将传递的数组值与寄存器中的值进行比较?并解释一下为什么这个实现不起作用?
【问题讨论】:
-
非常感谢!当我将它存储到 ECX 或 EDX 并与 EAX 进行比较时,它就可以工作了!
-
RBX 保留调用;选择一个不同的寄存器。 (以及固定负载的操作数大小)。例如
cmpl $70, (%rdi, %rdx, 4)。请注意,它的比较顺序与您所做的相反,加载结果作为右手操作数。
标签: assembly gcc x86-64 inline-assembly att