gpt4 book ai didi

c - 从 C 传递到 Assembly 的 Int 参数丢失其符号

转载 作者:行者123 更新时间:2023-12-02 18:08:50 25 4
gpt4 key购买 nike

我正在尝试在汇编(64 位)中实现一个符号函数,然后从 C 调用它。
我的函数接受一个参数:一个无符号 int 并返回一个 int,它可以是 -1(如果参数为负)、0(如果参数为 0)和 1(如果参数为正)。

我的程序可以很好地检测正数和零,但如果我传递一个负数作为参数,那么它会将其作为正数处理并返回 1。

main.c:

#include <stdio.h>

extern int sign(signed int);

int main()
{
signed int num;
scanf("%d",&num);
printf("num: %d sign: %d\n",num,sign(num));
return 0;
}

sign.asm:

global sign

section .text
sign:
test rdi,rdi
js neg_lab
je zero_lab

mov rax,1
jmp end_lab

neg_lab:
mov rax,-1
jmp end_lab

zero_lab:
xor rax,rax

end_lab:
ret

起初我以为问题出在汇编代码中,所以我将测试的寄存器的值设置为正数,然后设置为负数,最后设置为零。效果很好。它也识别负数。
在那之后,我现在认为问题在于参数的传递。我认为参数的符号在某个地方丢失了,或者存储负数的 C 方式与汇编不兼容?

如果有任何帮助,我将不胜感激。预先感谢您!

最佳答案

这是因为您已将函数声明为采用 32 位整数,但将其实现为可处理 64 位整数。因此,当您将 -1 传递给该函数时,它实际上会收到 0x00000000ffffffff,而不是您可能期望的 0xffffffffffffffff

有两种方法可以解决此问题:

或者,重写声明以使用 64 位整数:

extern long long sign(unsigned long long);

或者重写代码以使用 32 位整数,例如像这样:

global sign

section .text
sign:
test edi,edi
js neg_lab
je zero_lab

mov eax,1
jmp end_lab

neg_lab:
mov eax,-1
jmp end_lab

zero_lab:
xor eax,eax

end_lab:
ret

请注意,返回值和参数的大小可以独立决定。它们不必具有相同的大小。

关于c - 从 C 传递到 Assembly 的 Int 参数丢失其符号,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/72734486/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com