2017-10-12 117 views
2

這是我第一次問,所以我要在這裏盡我所能,但是我在彙編任務中遇到了麻煩,在這個彙編任務中我給了一個.cpp文件(下面),並且必須創建一個包含乘法,方形和除法函數的.asm文件。我遇到的問題是Square和Multiply函數完成後,我必須調用PrintResult來顯示答案。對於分區,成功的分隔返回1,不成功的分隔返回0並調用PrintResult顯示失敗消息。我不允許編輯他的.cpp文件,但我不知道如何成功調用PrintResult。我不斷收到一個錯誤,說有一個未定義的符號。在彙編文件中調用C++函數

這裏給出的.cpp:

#include <iostream> 

using namespace std; 

enum ResultCode { ShowSquare, ShowMultiply, ShowDivide, ShowRemainder, ShowDivideFailure }; 
enum SuccessCode { Failure, Success }; 

extern "C" SuccessCode Divide(long, long, long &, long &); 
extern "C" long Multiply(long, long); 
extern "C" void PrintResult(ResultCode, long); 
extern "C" long Square(long); 

void main() 
{ 
    long Num1; 
    long Num2; 
    long Result; 
    long Remainder; 
    do 
    { 
     cout << "Enter Number to Square" << endl; 
     cin >> Num1; 
     Result = Square(Num1); 
     cout << "Square is: " << Result << endl; 
     cout << "Enter two numbers to multiply" << endl; 
     cin >> Num1 >> Num2; 
     Result = Multiply(Num1, Num2); 
     cout << "Result of multiply is: " << Result << endl; 
     cout << "Enter mumber to divide into then number to divide by" << endl; 
     cin >> Num1 >> Num2; 
     if (Divide(Num1, Num2, Result, Remainder) == Success) 
      cout << "Result is " << Result << " and remainder is " << Remainder << endl; 
     else 
      cout << "Attempted division by zero"; 
    } while (Result > 0); 
} 

void PrintResult(ResultCode PrintCode, long Value) 
{ 
    switch (PrintCode) 
    { 
    case ShowSquare: 
     cout << "Display of square is: " << Value << endl; 
     break; 
    case ShowMultiply: 
     cout << "Display of multiply is: " << Value << endl; 
     break; 
    case ShowDivide: 
     cout << "Display of divide is " << Value << endl; 
     break; 
    case ShowRemainder: 
     cout << "Display of remainder is " << Value << endl; 
     break; 
    case ShowDivideFailure: 
     cout << "Display of Division by zero" << endl; 
     break; 
    default: 
     cout << "Error in assembly routines" << endl; 
    } 
} 

,這裏是我迄今爲止爲.ASM文件:

.386 
.model flat 
.code 

public _Square 
public _Multiply 
public _Divide 


_Square  proc 
      mov  eax, [esp + 4] 
      imul eax, eax 
      push eax 

      push eax 
      push 0 
      call _PrintResult 
      add  esp, 8 

      pop  eax 

      ret 
_Square  endp 

_Multiply proc 
      mov  eax, [esp + 8] 
      mov  ebx, [esp + 4] 
      imul eax, ebx 


      ret 
_Multiply endp 

_Divide  proc 


      ret 
_Divide  endp 


end 

目前我_Square功能有什麼,我從另外一個答案拉在這裏,但不起作用。它告訴我PrintResult是未定義的。我有我的_Multiply寫出來,但它沒有當然的呼籲,我可以寫在_Divide一旦我知道如何格式化這樣的東西會看起來..

任何幫助超過讚賞!

+0

注會更好:JavaScript的選手不要做C++。 – user4581301

+0

非常感謝您,我無法弄清楚如何正確格式化。這種方式似乎是最容易分開而不是切割線。 – Arcadiaen

+1

你必須告訴你的MASM代碼'_PrintResult'是一個外部標籤。將此添加到彙編代碼的頂部'extern _PrintResult:接近' –

回答

0

您可以使用EXTERN告訴彙編程序關於外部事物。

EXTERN _PrintResult 

在這種情況下,你可以使用PROTOINVOKE MSDN : proto/invoke

PrintDisplay PROTO C arg1:SWORD, arg2:SWORD 

其次

INVOKE PrintDisplay 0, eax 
+0

在MASM [EXTERN](https://msdn.microsoft.com/en-us/library/7cycf5bc.aspx)中需要冒號':'和類型,所以我不相信'EXTERN _PrintResult'會正確安裝沒有錯誤。 –