簡體   English   中英

我正在嘗試將匯編代碼鏈接到 C++,但我不知道它是如何工作的

[英]I'm trying to link assembly code to C++, but I don't know how it works

我想將匯編代碼鏈接到 C++,下面是我的代碼。

這是.cpp

#include <iostream>
#include <time.h>
using namespace std;

extern "C" {int IndexOf(long searchVal, long array[], unsigned count); }

int main()
{
//Fill an array with pseudorandon integers.
const unsigned  ARRAY_SIZE = 100000;
const unsigned  LOOP_SIZE = 100000;

char F[] = "false";
char T[] = "true";
char* boolstr[] = {F,T};

long array[ARRAY_SIZE];
for (unsigned i = 0; i < ARRAY_SIZE; i++)
    array[i] = rand();

long searchval;
time_t startTime, endTime;
cout << "Enter an integer value to find:";
cin >> searchval;
cout << "Please wait... \n";

//Test the Assembly language function.
time(&startTime);
int count = 0;
for (unsigned n = 0; n < LOOP_SIZE; n++)
    count = IndexOf(searchval, array, ARRAY_SIZE);  //Here

bool found = count != -1;

time(&endTime);
cout << "Elapsed ASM time: " << long(endTime - startTime)
    << " seconds. Found = " << boolstr[found] << endl;

return 0;
}

這是.asm

;IndexOf function (IndexOf.asm)

.586
.model flat, C

Indexof PROTO,
srchval:DWORD, arrayPtr: PTR DWORD, count: DWORD

.code
;---------------------------------------------------------------------
IndexOf PROC USES ecx esi edi,
srchval: DWORD, arrayPtr : PTR DWORD, count: DWORD
;
;Performs a linear search of a 32-bit integer array,
;looking for a specific value. If the value is found,
;the matching index position is returned in EAX;
;otherwise, EAX equals -1.
;---------------------------------------------------------------------
NOT_FOUND = -1

mov eax, srchval            ; search value
mov ecx, count              ; array size
mov esi, arrayPtr           ; pointer to array
mov edi, 0                  ;index

L1: 
cmp [esi+edi*4], eax
je found
inc edi
loop L1
notFound:
mov al, NOT_FOUND
jmp short exit

found:
mov eax, edi

exit:
ret
IndexOf ENDP
END

它與 Irvine 的教科書匯編語言中的代碼相同。 而且我已經設置了構建自定義,並選中了 masm 旁邊的框。 我還設置了 .asm 屬性,然后將項目類型更改為 Microsoft Macro Assembler。

我不知道如何將這兩個文件鏈接在一起。 我想知道問題是否在於.cpp 或.asm 中的某些代碼。

請幫助我:(謝謝!!

我在這里沒有給出確切的答案,這個答案可能有點粗略,但是在這個鏈接中,請注意問題中的鏈接命令,如果你可以為自己獲取 cpp 和 asm 的兩個 obj 文件,我認為它應該可以工作. 如果你正在學習,你可以嘗試制作一個 nmake 文件。 我認為一些匯編程序員會這樣做。 我有 Irvine 的書,我不記得他混合了 c++ 和 asm

如何在 MASM 中為一個項目編寫和組合多個源文件?

它比我在這里說的要復雜一些,但基本上要混合兩者,他們必須使用相同的調用約定。 在 Windows 上,我認為這是 __stdcall 基本上程序需要知道如何使用兩個源文件之間的堆棧。 旁注,win32 api 標頭中的大部分內容歸結為 __stdcall。

https://docs.microsoft.com/en-us/cpp/cpp/stdcall?view=msvc-170

這不是專業的答案,但可能會有所幫助

PS我沒有注意到你對IndexOf.h的評論,試着去掉你在extern“C”行上的{},我認為這基本上是你在頭文件中找到的,頭文件通常聲明函數,但不要定義函數

程序輸出

編輯附加信息:

對於您的最后一條評論,如果您要問自己在問什么,它的工作原理是這樣的: extern "C" int IndexOf(long searchVal, long array[], unsigned count); 被稱為函數原型,這意味着它告訴編譯器存在具有此“indexof”簽名的函數,但這並不意味着該函數已實現或定義該函數的作用。 您的實現是在 asm 中,但只要簽名相同,它就可以很容易地用 c++ 替換。 我猜您在此過程中可能遇到的錯誤之一是未找到 IndexOf 定義的鏈接器錯誤,這僅意味着您的 C++ 在說,嘿,您說我們有一個 indexOf 函數,我需要它但找不到它。 這發生在鏈接階段,其中 C++ 和 asm 的目標文件被鏈接以創建 exe 文件。 所以是的,如果您使用的是 Vs,您可以使用調試器進入您的 indexOf 匯編代碼,甚至將斷點放在 asm 文件中。 旁注:在windows(我猜是linux)中,例如在針對API(windows的功能)進行編程時,您可以進入匯編代碼,但這並不是真正的源代碼,它只是已鏈接的機器代碼進入您的 exe,有​​時您可以在堆棧跟蹤中看到,例如,所有 Windows exe 都以 ntdll.dll 開頭,因為它包含進程加載器。 由於Linux是開源的,我猜如果你加載了它,你的代碼會進入操作系統源代碼,而MS可以在他們擁有它時進入Windows的代碼。 它歸結為調試符號,在構建項目后在項目文件夾中查找 pdb 文件(在具有 MASM/Vs 的 Windows 平台上)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM