我試圖在匯編(64位)中實作一個符號函式,然后從C呼叫它。
我的函式接受一個引數:一個無符號整數并回傳一個整數,它可以是-1(如果引數是負數),0 (如果引數為 0)和 1(如果引數為正)。
我的程式可以很好地檢測正數和零,但是如果我將負數作為引數傳遞,那么它將作為正數處理并回傳 1。
主.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;
}
簽名.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 方式與匯編不兼容?
我將不勝感激任何幫助。先感謝您!
uj5u.com熱心網友回復:
這是因為您已宣告您的函式采用 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
請注意,回傳值和引數的大小可以獨立決定。它們不必具有相同的大小。
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/495917.html
