我需要在匯編中解決這個函式,但我有一個模數問題。我不知道為什么,但它給出了非常奇怪的結果。
C 代碼
#include <iostream>
extern "C" __int64 suma(int a, int b, int c, int d, int e, int f, int g, int h);
int main()
{
int a = 1, b = 1, c = 1, d = 1, e = 1, f = 1, g = 1, h = 1;
int wynik = suma(a, b, c, d, e, f, g, h);
std::cout << wynik;
}
匯編代碼
.CODE
_DATA SEGMENT
_DATA ENDS
_TEXT SEGMENT
PUBLIC suma
suma PROC
push rbp;
mov rbp, rsp;
imul rcx, rdx; // a * b
mov rax, r8; // c
xor rdx, rdx;
div r9; // c/d
mov r10, [rbp 6 * 8]; //e
sub r10, [rbp 7 * 8]; // e-f
mov r11, [rbp 8 * 8]; // g
add r11, [rbp 9 * 8]; //g h
add rcx, rax; // a * b c / d
sub rcx, r10; // a * b c / d - e - f
mov rdx, 0;
mov rax, rcx;
idiv r11;
mov rax, rdx;
pop rbp;
ret
suma ENDP
_TEXT ENDS
END
uj5u.com熱心網友回復:
不確定這是否是您想要的,但是當您必須在匯編中撰寫某些內容時,首先查看編譯器生成的內容通常是個好主意。
我不確定為什么__int64當你將它分配給時你有一個回傳型別int,但我會尊重你給定的函式原型。
__int64 suma(int a, int b, int c, int d, int e, int f, int g, int h);
我將使用的編譯器是 Linux 中的 GCC,但您的暫存器使用遵循 Windows ABI,因此我將更改宣告如下。
__attribute__((ms_abi))
long long suma(int a, int b, int c, int d, int e, int f, int g, int h);
現在將您的一行代碼放入正文中,并通過優化 ( -O3) 查看輸出。
{
return a * b c / d - (e - f) % (g h);
}
suma:
mov eax, r8d
imul ecx, edx
mov r8d, DWORD PTR [rsp 64]
add r8d, DWORD PTR [rsp 56]
cdq
idiv r9d
add ecx, eax
mov eax, DWORD PTR [rsp 40]
sub eax, DWORD PTR [rsp 48]
cdq
idiv r8d
sub ecx, edx
movsx rax, ecx
ret
最后讓它看起來更好,更像是人工撰寫的。
suma:
imul ecx, edx
mov eax, r8d
cdq
idiv r9d
add ecx, eax
mov eax, DWORD PTR [rsp 40]
sub eax, DWORD PTR [rsp 48]
cdq
mov r8d, DWORD PTR [rsp 56]
add r8d, DWORD PTR [rsp 64]
idiv r8d
sub ecx, edx
movsx rax, ecx
ret
另外,作為個人意見,不要盲目寫
push rbp;
mov rbp, rsp;
在每個函式的入口處。在實際意義上,這部分是必要的情況很少見。
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/481975.html
上一篇:通過匯編指令了解暫存器的地址分配
下一篇:RISCV無分支編碼
