美文网首页
2019-01-08 (一)C语言和Intel汇编混合编程dem

2019-01-08 (一)C语言和Intel汇编混合编程dem

作者: 北枳_91d9 | 来源:发表于2019-01-09 02:10 被阅读0次

foo.asm

extern choose                           ;C语言中的函数 int choose(int a,int b)
[section .data]                         ;数据段
num1st      dd      3                   ;参数a
num2nd      dd      4                   ;参数b

[section .text]                         ;代码段
global      _start                      ;程序起点
global      myprint                     ;输出函数
_start:
            push    dword   [num2nd]    ;将参数入栈
            push    dword   [num1st]
            call    choose              ;调用C语言函数
            add     esp,    8

            mov     ebx,    0
            mov     eax,    1           ;sys_exit
            int     0x80                ;系统调用

myprint:
            mov     edx,    [esp+8]     ;len    
            mov     ecx,    [esp+4]     ;msg
            mov     ebx,    1               
            mov     eax,    4           ;sys_write
            int     0x80                ;系统调用
            ret      
         

bar.c

void myprint(char *msg,int len);    //foo.asm中的myprint

int choose(int a,int b){    
    if(a>=b){
        myprint("1\n",3);
    }else{
        myprint("2\n",3);
    }
    return 0;
}

编译命令

nasm -f elf -o foo.o foo.asm 
gcc -m32 -c -o bar.o bar.c
ld -m elf_i386 -s -o foobar foo.o bar.o 
./foobar 

输出

2

遇到的问题

  1. 书中ld -s -o foobar foo.o bar.o 报错:ld: i386 架构于输入文件 foo.o 与 i386:x86-64 输出不兼容

    产生原因:因为运行书中的

    gcc -c -o bar.o bar.c
    

    默认在64位的机器上默认生成64位的目标代码,而nasm生成的是32位目标代码,两者无法链接

    解决方案:

    使gcc编译32位目标代码

    gcc -m32 -c -o bar.o bar.c
    

    链接时加上32位的选项

    ld -m elf_i386 -s -o foobar foo.o bar.o  
    

相关文章

  • 2019-01-08 (一)C语言和Intel汇编混合编程dem

    foo.asm bar.c 编译命令 输出 遇到的问题 书中ld -s -o foobar foo.o bar.o...

  • C与汇编混合编程(汇编语言环境配置)

    之前想在双系统上配置汇编环境,无奈最后采用汇编和c混合编程。 因为大对数人学的都是Intel的8086汇编,但是微...

  • 2017-06-28 51单片机混合编程小结

    C语言与汇编混合编程(keil)时:1、首先要在Project 窗口中包含汇编代码的C 文件上右键,选择“Opti...

  • 编译与反编译

    编程语言分为低级语言和高级语言)。其中机器语言和汇编语言属于低级语言,直接用计算机指令编写程序,而C、C++、Ja...

  • 第一章 、介绍

    课程概述 预备知识 计算机结构原理(Intel 80386+) C与汇编程序设计 数据结构 参考教材 课程内容 ■...

  • 解释执行与编译执行

    编程语言分为低级语言和高级语言,机器语言、汇编语言是低级语言,C、C++、java、python等是高级语言。机器...

  • C语言第一节

    1、机器码—机器语言 2、汇编语言,汇编语言和机器码是一一对应的 3、高级语言 1、C:结构化编程语言 2、C++...

  • 内联汇编

    AT&T汇编语法 GCC只支持AT&T汇编语法内嵌在C语言中。 Intel和AT&T汇编风格对比: AT&T寻址 ...

  • 解释型语言和编译型语言的区别

    转载自:解释型语言和编译型语言的区别 解释型语言和编译型语言的区别 首先,我们编程都是用的高级语言(写汇编和机器语...

  • 浅谈C/C++混合编程

    首先, 在介绍C/C++混合编程之前, 先思考几个问题 1. C/C++混合编程是什么? 2. C/C++混合编程...

网友评论

      本文标题:2019-01-08 (一)C语言和Intel汇编混合编程dem

      本文链接:https://www.haomeiwen.com/subject/wpnirqtx.html