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