C++ 向程序集中的参数(Param1、Param2等)添加宏

C++ 向程序集中的参数(Param1、Param2等)添加宏,c++,visual-studio,assembly,macros,C++,Visual Studio,Assembly,Macros,我在完成涉及添加宏的作业时遇到问题。在为除法函数将Param1和Param2按入M5(第五个宏)并调用之后,我在运行它之后遇到了一个错误的结果和余数:“结果是4,余数是-858993460。”除了到目前为止我所做的之外,我不知道为了完成该程序还需要执行哪些其他步骤 以下是我在任务中得到的指示: 修改lab seven,以便为每次调用创建一个宏。宏的参数将是:函数名、参数1、参数2等。该宏最多允许五个参数,但如果传递给它的只是这些参数,则使用的参数将更少。还可以为每个函数的启动创建宏(这是一个宏,

我在完成涉及添加宏的作业时遇到问题。在为除法函数将Param1和Param2按入M5(第五个宏)并调用之后,我在运行它之后遇到了一个错误的结果和余数:“结果是4,余数是-858993460。”除了到目前为止我所做的之外,我不知道为了完成该程序还需要执行哪些其他步骤

以下是我在任务中得到的指示: 修改lab seven,以便为每次调用创建一个宏。宏的参数将是:函数名、参数1、参数2等。该宏最多允许五个参数,但如果传递给它的只是这些参数,则使用的参数将更少。还可以为每个函数的启动创建宏(这是一个宏,用于执行push ebp和mov ebp、esp语句)以及每个函数的返回(pop ebp和ret语句)

下面是Main.cpp代码(不需要修改):

#包括
使用名称空间std;
枚举结果代码{ShowSquare、ShowMultiply、ShowDivide、showRequires、ShowDivideFailure};
枚举成功代码{失败,成功};
外部“C”成功代码除法(long,long,long&,long&);
外部“C”长乘法(长,长);
外部“C”无效打印结果(结果代码,长);
外部“C”长广场(长);
void main()
{
长Num1;
长Num2;
长期结果;
长余数;
做
{
coutnum1;
结果=平方(Num1);

你能在哪里给P2赋值吗?我想你的提醒是
-858993460
,因为在使用之前没有初始化某些变量。@V.Panchenko P2被分配给M3和M4。我试图将P2引入除法过程,但没有任何效果。我认为它们不属于那里。M2宏发出
ret
指令。调用MM2之后的5在_divide过程中是无意义的。M2之后的所有
ret
指令都是无意义的。此外,由于M2只弹出
ebp
,因此无需在参数中传递它。M5应该调用过程,并且将寄存器作为参数传递。。。
#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 a mumber to divide into, then a number to divide by. " << endl;
        cin >> Num1 >> Num2;
        if (Divide(Num1, Num2, Result, Remainder) == Success)
            cout << "The result is " << Result << ", and the 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;
    }
}
.386

.model flat

public _Square
public _Multiply
public _Divide
extern  _PrintResult:proc

Param1 = 4          ; creates a named constant, only works with whole numbers

Param1 = 8          ; names can be redefined
Param2 = 16
Param3 = 24
Param4 = 32
Param5 = 40

M1      macro
        push    ebp
        mov     ebp, esp
        endm

M2      macro   P1
        pop     P1
        ret
        endm

M3      macro   P1:REQ, P2          ;; :REQ means the parameter is required
IFB <P2>
P1      BYTE    0, 1, 2, 3, 4, 5
ELSE
P1      P2      0, 1, 2, 3, 4, 5
ENDIF
        endm

M4      macro   P1, P2
LOCAL   L1, L2
        cmp     P1, P2
        jl      L1
        inc     P1
        jmp     L2
L1:     inc     P2
L2:
        endm

M5      macro   Param1, Param2
        push [Param1]
        push [Param2]
    ;   push [Param3]
    ;   push [Param4]
    ;   push [Param5]
        Call    Param1
        Call    Param2
    ;   Call    Param3
    ;   Call    Param4
    ;   Call    Param5
        add ebp, 8
        endm

.code

_Square proc
       M1
       finit
       mov eax, [ebp + 8]
       imul eax
       M2 ebp
       ret
_Square endp

_Multiply proc
       M1
       finit
       mov eax, [ebp + 8]
       mov ebx, [ebp + 12]
       imul ebx
       M2 ebp
       ret
_Multiply endp

_Divide proc
       M1
       finit
       mov eax, [ebp + 8]
       mov ebx, [ebp + 12]
       mov ecx, [ebp + 16]
       mov edx, 0
       idiv ebx
       mov ecx, eax
       mov ebx, [ebp + 20]
       mov ebx, edx
    ;   M5 ebp, esp
    ;   Call    _PrintResult
    ;   add ebp, 8
       M2 ebp
       M5 ebp, esp
       ret
_Divide endp

.data

db  255

end