我从这里回忆,所以我可能会在一两个细节上稍微偏离。不过,我希望这足以让你朝着正确的方向前进。
您将需要告诉GCC汇编程序,您的例程printSomething()没有在您的程序集文件中定义。在'C'中,您可以使用extern关键字。对于装配,您需要使用.globl。
.globl printSomething
如果使用与GCC不同的汇编器,关键字可能会有所不同。
下一个大问题是'我该如何传递参数'?这非常依赖于你的处理器和操作系统。由于问题的标题指示x86,因此我将假设您正在使用16位或32位模式以及标准x86 ABI(与Windows和Linux之间的x86-64不同)。 C参数通过将它们推入堆栈传递给被调用的例程。他们从右到左推入堆栈。
因此,
printSomething (arg1, arg2, arg3, arg4);
转换为...
pushl arg4
pushl arg3
pushl arg2
pushl arg1
call printSomething
addl $0x10, %esp
您可能会问自己,这是什么
addl $0x10, %esp
?我们将四个32位参数传递(也就是推送)到例程(到堆栈中)。尽管该例程知道期望这些参数,但它不负责将它们从堆栈弹出。来电者对此负责。所以,当我们从例程中返回后,我们调整堆栈指针,放弃先前推入堆栈的四个32位参数。
在上面的例子中,我假设我们在32位模式下运行。如果是16位模式,这将是...
pushw arg4
pushw arg3
pushw arg2
pushw arg1
call printSomething
addw $0x8, %sp
我意识到,在你的榜样,printSomething()只需要一(1)的说法,在我的例子中,我使用了四个(4) 。根据需要调整我的示例。
对于最后的步骤,您需要将C和汇编文件编译为目标文件,链接目标文件然后执行。
我希望这会有所帮助。