GCC跟NASM联合编译

GCC和NASM联合编译

GCC和NASM

GCC不用说,C语言的编译器。NASM是一个x86的汇编器,用来编译汇编的。最近在研究GCC和NASM联合编译,为什么要研究二者的联合编译呢?GCC中能嵌套汇编代码啊?这是因为GCC中嵌套的汇编代码是AT&T的汇编代码不是Interl的。其语法格式实在是太复杂了,不是适合初学者(其实是我不会其语法)。下面我们结合一个例子来将二者如何联合使用。

1.建立示例工程

示例工程很简单,就下面三个文件:

main.c         ---C代码
hello.asm    --- 汇编代码
Makefile      ---编译命令

其中Makefile的内容如下:

all:nasm -f elf hello.asm -o hello.ogcc -o main main.c hello.o

其中nasm的参数 -f elf表示输出文件的格式为ELF格式。

2.NASM和C互相调用对方的函数

先看例子的代码:

extern print_helloworld[section .text]
global print_two_hello_world
print_two_hello_world:  call print_helloworldcall print_helloworld
#include "stdio.h"extern void print_two_hello_world();char *strhello = "Hello,world!\n";void print_helloworld ()
{printf ("%s",strhello);
}int  main ()
{print_two_hello_world();return 0;
}

首先看NASM代码,先导入一个外部函数print_helloworld(),此函数是C语言定义的一个函数。接下来是定义了一个函数print_two_hello_world,用global关键字导出使其可以在C中调用,函数的内容是调用了两次print_helloword()。

在来看C代码,代码很简单就具体讲了,这里主要数一下我们将主函数放在了C代码中写,这时因为我们要使用C代码的函数库中的printf()函数,如果C代码中没有什么库的依赖可以将主函数放在汇编代码中,具体的实现请参考《自己动手写操作系统》一书。

3.NASM和C互相调用对方的变量

同样先看代码:

global string
extern strhello
[section .data]
string:db 'I am Chinese.',0x0A,0x0
[section .text]global print_helloglobal cpy_mem
print_hello:    mov edx, 13mov ecx,[strhello]mov ebx,1mov eax,4int 0x80
#include "stdio.h"
#include "string.h"
extern char *string;
extern void print_hello();
extern cpy_mem (void *dest, int len);
char *strhello = "Hello,world!\n";
char *str = NULL;
int
main ()
{printf ("%x\n",&string);str = &string;printf ("%s", str);print_hello ();return 0;
}

Make后的执行结果如下:

具体的代码内容就部分析了,这里主要将两个关键的地方。

1.在C语言中定义了一个strhello的字符串变量,在C语言中strhello表示的是字符串的首地址,比如字符串的地址是0xa00001,而strhello是个指针即4字节其地址为0xb00001,在C语言中strhello表示的值是0xa00001字符串的首地址,但到了NASM中则表示的strhello变量的首地址了0xb00001,所以

mov ecx,[strhello]

代码中加了中括号表示是内容,这一点一定要注意,否则会出错!!

2.第二点要注意的是,在NASM中定义了一个字符串string,在C语言中导入的话,就是表示字符串的首地址,因此要引用该字符串一定要取其地址,不要直接转为(char*)类型直接用,否则出错,这是因为直接转的话,就将字符串的前4个字节转成了字符串指针,但该指针是不确定会出现段错误!

GCC跟NASM联合编译相关推荐

  1. Ubuntu下用gcc与nasm联合编译

    1.代码 foo.asm [plain] view plaincopy ;编译链接的方法 ;(id的'-s'选项意为"strip all") ; ;$ nasm -f elf fo ...

  2. C++和NASM联合编译

    有时候需要在C/C++里调用汇编代码,但又不想写内联asm,就需要一些特殊手段了. 在64位编译32位的代码 划重点,我用的是64位的Centos7.Ubuntu同理,但是安装的库不太一样,下面会提到 ...

  3. FAT12文件系统镜像查看工具linux下的实现(nasm、g++联合编译

    FAT12文件系统镜像查看工具linux下的实现(nasm.g++联合编译) 简介 构思简介 附加链接 最终实现截图 代码 Makefile代码 my_print.asm代码 main.cpp代码 简 ...

  4. arm linux gcc 4.6.3,编译gcc-4.6.3

    编译gcc-4.6.3 准备 下载GCC 源码包 : gcc-4.6.3.tar.bz2 下载GCC 依赖包: gmp-5.0.4.tar.bz2, mpfr-3.1.0.tar.bz2 ,mpc-0 ...

  5. 【嵌入式开发】gcc 学习笔记(一) - 编译C程序 及 编译过程

    一. C程序编译过程 编译过程简介 : C语言的源文件 编译成 可执行文件需要四个步骤, 预处理 (Preprocessing) 扩展宏, 编译 (compilation) 得到汇编语言, 汇编 (a ...

  6. gcc/g++等编译器 编译原理: 预处理,编译,汇编,链接各步骤详解

    例子:由多个源文件组成的C程序,经过编辑.预处理.编译.链接等阶段才能生成最终的可执行程序.此过程中,在__c__阶段可以发现被调用的函数未定义. A. 编辑和预处理 B. 预处理 C. 编译 D. ...

  7. vxworks gcc linux,针对VxWorks的GCC交叉编译器无法编译C++

    我试图移植Linux库以在VxWorks上运行.我已经成功构建了binutils和gcc,目标为i486-wrs-vxworks,我可以成功构建一个简单的C程序.但是,当我尝试编译C++时,事情就会中 ...

  8. GCC 使用-C语言编译过程

    任何一种高级语言,要想在机器上执行,必须翻译为机器能读懂的机器语言.编译器就相当于翻译官,将高级语言翻译为机器语言. GCC 最初只用了编译 C 语言程序,全称是 GNU C Compiler.后来扩 ...

  9. VScode使用记录二:Windows 7下安装GCC、使用VSCode编译代码

    目录 一.概述 二.安装 2.1 GCC编译器 2.2 安装VSCode 2.3 安装插件 三.编译文件 3.1 编译单个文件 3.2 编译多个文件 四.调试程序 一.概述 平时都是在keil下工作, ...

最新文章

  1. JAVA环境变量的配置
  2. Activex、OLE、COM、OCX、DLL之间区别、联系
  3. 怎么在表单提交前检查数据输入。
  4. html <link>标签
  5. XgBoost使用及调参教程
  6. Android的intent之间复杂参数的传递
  7. 一个关于WCF调用远程链接返回405错误不允许使用此方法的问题
  8. 系统程序员成长计划-走近专业程序员
  9. python exchangelib 删除邮件_Python exchangelib在子文件夹中读取邮件 - python
  10. 如何减小电压跟随器输出电阻_补课贴 | 关于运算放大器和比较器的异同,那些你不得不知道的小知识!...
  11. php168 shell,php168 v6/v7鸡肋Getshell安全问题
  12. java实现代理服务器
  13. 建材物资管理系统(软件定义)
  14. Alibaba之EasyExcel使用
  15. 史上最全的正则表达式-匹配中英文、字母和数字
  16. MAF 项目创建流程
  17. 程序员转行后都怎么样了,分享我身边的真实经历!
  18. 刘涛代言的美丽田园冲刺港股:年内盈利2亿 突击分红1.2亿
  19. 【数学建模】经典简单例题实例1
  20. 在DJI大疆做算法的日常工作与体验~

热门文章

  1. 【Linux 内核】实时调度类 ② ( 实时调度实体 sched_rt_entity 源码分析 | run_list、timeout、watchdog_stamp、time_slice 字段 )
  2. 【Android 插件化】多开原理 | 使用插件化技术的恶意应用 | 插件化的其它风险 | 应用开发推荐方案
  3. 【Android 应用开发】 Android 各种版本简介 ( Support 支持库版本 | Android Studio 版本 | Gradle 版本 | jcenter 库版本 )
  4. vue3.0以上关于打包后出现空白页和路由不起作用
  5. linux下sort命令使用详解---linux将文本文件内容加以排序命令
  6. Maven实战系列文章目录
  7. ubuntu 串口转usb使用
  8. Android Service 服务(二)—— BroadcastReceiver
  9. 用JS实现一个定时间段的跳转
  10. 单词:readme emulate prompt cross-reference copyright align