我有一个名为C. c的C文件,现在在这个文件中,我有一个函数,它比较两个数字,并将较大的数字保存到寄存器eax中。
我需要帮助创建第二个函数,该函数将在内部调用printf
并打印一些文本。如何在C中添加对printf
的支持,使我可以从MASM汇编程序中调用?
我的masm文件:
TITLE MASM Template (main.asm)
.386
.model FLAT
.stack 4096
WriteString PROTO stdcall
ReadChar PROTO stdcall
Crlf PROTO stdcall
ExitProcess PROTO stdcall:DWORD
greater PROTO C :DWORD, :DWORD
.data
PorukaZaIspis db "Poruka za ispis", 0
.code
_main PROC
push 8
push 3
call greater
call Crlf
mov edx, OFFSET PorukaZaIspis
call WriteString
call ReadChar
Invoke ExitProcess, 0
_main ENDP
END _main
END
我的抄送文件:
int greater(int a, int b) {
if ( a > b)
return a;
else
return b;
}
2条答案
按热度按时间bq8i3lrv1#
你需要链接到一个合适的库(例如
msvcrt.lib
),并且你需要知道函数的导出名称。C函数的调用约定称为“cdecl”。参数被压入堆栈,并且在调用后必须调整堆栈。如果你将函数声明为
PROTO C
,你可以让MASM使用INVOKE
来完成这项工作。示例:
测试.asm:
让我们在C文件中添加一个输出函数:
抄送:
使用以下批处理文件播放:
ny6fqffe2#
我刚从MASM for x86附带的tutorial/console/demo 1开始做了这个。它说使用下拉菜单“Project”中的console选项进行编译。它运行得很好,我认为它接近入门的最低要求:
我在这里使用printf从寄存器中打印。我发现printf本身会影响寄存器EAX、ECX和EDX,因为如果在printf语句传递
add
之前没有重新加载eax,add
将不会给予正确的结果。(在调试器中单步调试并观察寄存器值的变化时,也会看到这种情况)。这将从eax和ebx寄存器打印,但是你可以按照C语法打印任何你想要的东西。重要的是包括这两行:
您需要同时包含这两个属性;
.inc
定义了printf()
C样式宏,因此没有它语法将无法工作。rkhb对这个问题的回答说明了如何手动声明
printf
,然后像调用其他函数一样用标准的MASMINVOKE
调用它,或者甚至自己推参数,在没有MASM的情况下执行一个call printf
。