提交 f29b480f 创建 作者: 赵鹏翀's avatar 赵鹏翀

init template

上级
/*.img
/bochs
/Debug
/Release
bochsout.txt
\ No newline at end of file
# 32 位汇编程序
.intel_syntax # 使用 Intel 汇编语法
.text # 代码段
.globl _add_asm32 # 只有将此标号声明为全局的,才能从 C 代码中调用这个由 32 位汇编编写的函数
_add_asm32:
push ebp
mov ebp, esp
push ebx
mov eax, dword ptr [ebp + 0x8] # eax = a
mov ebx, dword ptr [ebp + 0xc] # ebx = b
add eax, ebx
push eax # pass eax to parameter n
push ebx # pass ebx to parameter m
call _add_c # call C function
pop ebx
leave
ret
\ No newline at end of file
<?xml version="1.0" encoding="gb2312"?>
<ASMProject Version="1.00" Name="console" TemplatePath="console(c)\Project" ProjectID="0737646b-6d1a-4703-983e-22e7e4c9bbc4" IsSubmitWork="0">
<Configurations>
<Configuration Name="Debug" DebuggerFlavor="0">
<Tool Name="PreBuildEventTool"/>
<Tool Name="CustomBuildTool"/>
<Tool Name="GCCCompilerTool" PreprocessorDefinitions="_DEBUG" GenerateDebugInformation="-1"/>
<Tool Name="JWASMAssemblerTool"/>
<Tool Name="PreLinkEventTool"/>
<Tool Name="GCCLinkerTool"/>
<Tool Name="JWlinkLinkerTool"/>
<Tool Name="PostBuildEventTool"/>
</Configuration>
<Configuration Name="Release" DebuggerFlavor="0">
<Tool Name="PreBuildEventTool"/>
<Tool Name="CustomBuildTool"/>
<Tool Name="GCCCompilerTool" PreprocessorDefinitions="NDEBUG"/>
<Tool Name="JWASMAssemblerTool"/>
<Tool Name="PreLinkEventTool"/>
<Tool Name="GCCLinkerTool"/>
<Tool Name="JWlinkLinkerTool"/>
<Tool Name="PostBuildEventTool"/>
</Configuration>
</Configurations>
<Files>
<Filter Name="ͷļ" Filter="h;hpp;hxx">
<File RelativePath=".\console.h">
</File>
</Filter>
<Filter Name="Դļ" Filter="cpp;c;cc;cxx">
<File RelativePath=".\asm.s">
</File>
<File RelativePath=".\console.c">
</File>
</Filter>
</Files>
</ASMProject>
/*
此样例程序展示了如何使用 C 语言和 32 位汇编语言进行混合编程。
其中,在 C 语言编写的函数中调用了 32 位汇编语言编写的函数,
同时在汇编语言编写的函数中也调用了 C 语言编写的函数。
C 语言与汇编语言混合编程时,只需要满足以下 C 函数调用约定即可:
1. 全局变量的名称和函数名在翻译成汇编符号时,要在名称的前面添加一个下划线。
2. 通过调用栈(Call Stack)传递函数参数。函数参数入栈的顺序是从右到左。
3. 被调用函数(Callee)返回后,由调用者(Caller)释放函数参数占用的栈空间。
4. 通过 EAX 寄存器传递函数的返回值。
5. 被调用函数在使用 EBX、ESI、EDI、EBP 寄存器前要先保存这些寄存器的值,
在函数返回时还要恢复这些寄存器的值。被调用函数可以随意使用 EAX、ECX、EDX 寄存器。
*/
#include "console.h"
// 在 C 语言程序中调用 32 位汇编语言编写的函数之前,
// 必须先将其声明为 C 函数,否则编译时会报错。
int add_asm32(int a, int b);
// 在 32 位汇编程序中会调用此 C 函数
int add_c(int m, int n)
{
return m + n;
}
int main(int argc, char* argv[])
{
int a, b, c;
a = 16;
b = 32;
c = add_asm32(a, b);
printf("c = %d\n", c);
return 0;
}
#ifndef _CONSOLE_H_
#define _CONSOLE_H_
#include <stdio.h>
/* TODO: 在此处引用程序需要的其他头文件 */
#endif /* _CONSOLE_H_ */
添加文件
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论