易截截图软件、单文件、免安装、纯绿色、仅160KB

win7上的c和asm互调用

    最近在研究操作系统,《自己动手写操作系统》上第5章讲了asm和c函数之间互调用,目的是使用c来写操作系统内核的代码,毕竟用汇编写代码还是很费时间的事。
    配置Linux开发环境实在是太麻烦,要装虚拟机,还要配置老半天。于是就想能都在windows环境下实现互调用,很自然的想到了mingw交叉环境。于是下了一个win32版本的nasm编译器,用nasm编译汇编,用gcc编译c,查了一下nasm的编译选项-f可以指定asm文件的目标格式,估计可行,但考虑到mingw是交叉环境,感觉上还是用cl.exe来编c文件比较好,反正nasm也支持导出win32格式的obj文件。试了一下可行,现将代码贴上来。一共三个文件:bar.c, foo.asm, makefile.内容如下:
1. bar.c
#include <stdio.h>
void myprint(); // 函数声明
int choose(int a, int b)
{
int c;
// __asm int 3; // 加断点会进入VS调试器
__asm{ // 内嵌汇编测试,等价于:c = b + 1;
mov eax, dword ptr [b]
inc eax
mov dword ptr [c], eax
}
printf("a = %d, b = %d, c = %d.\n", a, b, c); // 输出:a = 3, b = 4, c = 5.
myprint(); // 调用foo.asm中的_myprint函数
return 0;
}
2. foo.asm
extern _choose ; int choose(int a, int b); 编译器编成的obj文件会将c函数名前自动加下划线
[section .data] ; 数据在此
num1st dd 3
num2nd dd 4
[section .text] ; 代码在此
global _main ; exe入口函数,同样要加下划线
global _myprint ; 导出这个函数为了让 bar.c 使用
_main:
push ebp
mov esp, ebp
push dword [num2nd] ; 参数入栈,从右至左
push dword [num1st]
call _choose ; 调用choose()
add esp, 8 ; 去掉参数
pop ebp
ret
; void myprint(char* msg, int len)
_myprint: ; 空调用
ret 
3. makefile
#加Zi,/DEBUG参数可以进入vs调试
CL=cl /Zi /c
LINK=link /DEBUG
#cl /Zi main.cpp, 也可编译带进vs2008调试的信息。
main.exe : foo.obj bar.obj
$(LINK) /OUT:main.exe foo.obj bar.obj
foo.obj : foo.asm
nasm -f win32 foo.asm -o foo.obj
bar.obj : bar.c
$(CL) bar.c


相关文档:

C bulider计算器初步

//---------------------------------------------------------------------------
#include <vcl.h>
#pragma hdrstop
#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
int   flag=0; // ......

object C 语法


XCode:你可以把它看成是一个开发环境,就好像Visual Studio或者Netbeans或者SharpDevelop一样的玩
意。你可以将Interface Builder认为是Visual Studio中用来画界面的那部分功能单独提出来的程序。
Objective-C:这是一种语言,就好像c++是一种语言,Java是一种语言,c#是一种语言,莺歌历史也是一
种语言一样。
Coco ......

objective c 函数声明

1) -/+: 这个称做scope, 如果在函数前面是- ,那么理解为一般的函数;如果是+, 可以理解为c++中的static函数
2) 函数的参数声明:
如果没有参数的话,在函数名后面,可以什么都不写;
如果只有一个参数,在 : 后面声明参数的类型和名称;
如果有多个参数的话,每个参数前面都要有一个 : , 然后接着是参数类型和参 ......

C头文件相互包含的问题

     在C++中,关于CPP的头文件互相包含的问题很让人头疼,其实我们谁也不愿意弄的结构混乱,难以理解,但有时又是有必须的。
     假定当前有两个头文件分别为 A.h  和 B.h,内容分别如下:
     A.h内容为:
     #ifndef  ......

通讯录C程序代码

#include <stdio.h>
#include <string.h> /* 程序多次调用biodkey(),应包含头文件bios.h */
#include <bios.h><br>/* 程序多次调用clrscr(),应包含头文件conio.h */
#include <conio.h>
#define MAX 100
#define PAGE 2
#define PRINT1 printf("------------------------------ ......
© 2009 ej38.com All Rights Reserved. 关于E健网联系我们 | 站点地图 | 赣ICP备09004571号