如何从Pascal执行此代码:
MOV EAX, variable1
PUSH EBX, EAX
MOV EAX, variable2
POP EBX
AND EBX, EAX
我在函数中定义方法/函数参数(variable1,variable2)。
这是一项学校作业,我不知道为什么他们让我们做Pascal / Assembly而不是Java / C ++等。
在我需要帮助之前,这不是我完成的大部分工作,任何帮助都表示赞赏谢谢
答案 0 :(得分:1)
基本上有两种方法可以调用显式汇编代码(来自任何语言,而不仅仅是来自Pascal)。
第一种方法是将程序集写入自己的文件中,并与汇编程序一起组装。然后,您将生成的目标文件与程序的其余部分链接起来,并且可以调用您的汇编函数。此方法将要求您了解编译器使用的调用约定,以便所有内容在链接和运行时排列。
第二种方法是使用'内联汇编',因为您将直接在常规语言源文件中编写汇编代码。您将需要使用特定于编译器的功能来声明程序集块并使其与编译器一起使用。此方法将使您的代码更难移植到其他编译器,但您可以在不必了解系统的ABI /调用约定的情况下逃脱。
答案 1 :(得分:0)
通常,外部过程或函数中的寄存器使用规则(Borland pascal)是您必须保留EDI,ESI,ESP,EBP和EBX寄存器,但您可以自由修改EAX,ECX和EDX寄存器。
因此,您的asm代码必须类似于:
MOV EAX, variable1 //EAX := variable1
PUSH EBX //save EBX
MOV EBX, variable2 //EBX := variable2
AND EAX, EBX //store result to EAX
POP EBX //restore EBX
依赖calling convention函数通过寄存器或堆栈返回参数。所以要确定你正在使用什么样的调用约定。
答案 2 :(得分:0)
详细说明GJ的答案,在Pascal / Delphi中,你可以将整个事情包装起来:
function TestAsmFunction (variable1, variable2: longword): longword;
assembler; {<- this was neccesary in Turbo Pascal, but not in Delphi}
register; {<- it's the default calling convention anyway. So variable 1=EAX, variable2= EDX}
asm
MOV EAX, variable1 {actually unneccesary (= mov eax, eax)}
PUSH EBX
MOV EBX, variable2 {compiles to mov ebx, edx}
AND EAX, EBX
POP EBX
end; {Return value is in EAX}