1

如何从 Pascal 执行此代码:

               MOV EAX, variable1
               PUSH EBX, EAX
               MOV EAX, variable2
               POP EBX
               AND EBX, EAX

我在函数(variable1,variable2)中定义方法/函数参数的地方。

这是一项学校作业,我不知道他们为什么让我们做 Pascal/Assembly 而不是 Java/C++ 之类的。

这不是我在需要帮助之前做了大量工作的全部任务,感谢任何帮助谢谢

4

3 回答 3

1

基本上有两种方法可以调用显式汇编代码(来自任何语言,而不仅仅是来自 Pascal)。

第一种方法是在自己的文件中编写程序集,并使用您的汇编程序进行汇编。然后,您将生成的目标文件与程序的其余部分链接起来,然后就可以调用您的汇编函数了。此方法将要求您了解编译器使用的调用约定,以便所有内容在链接和运行时对齐。

第二种方法是使用“内联汇编”,之所以这么称呼是因为您将直接在常规语言源文件中编写汇编代码。您将需要使用特定于编译器的功能来声明汇编块并使其与编译器配合得很好。这种方法会使您的代码更难移植到其他编译器,但您可能无需了解系统的 ABI/调用约定即可逃脱。

于 2010-06-11T22:09:21.970 回答
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

取决于调用约定,函数通过寄存器或堆栈返回参数。因此,请确定您使用的是哪种调用约定。

于 2010-06-12T08:19:20.520 回答
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}
于 2010-06-19T11:42:38.653 回答