zoukankan      html  css  js  c++  java
  • C语言与汇编语言混合编程实验

    混合编程方法:

    1. 模块链接法
    2. 汇编指令嵌入法

    1: 模块链接法则

    模块链接法是指分别用汇编语言和C语言实现独立的模块(或子程序),再用链接程序把各模块生成的obj文件连接成一个可执行程序。

    •  1:C语言调用汇编语言子程序:即由汇编语言实现子程序,C语言实现主程序。
    •  2: 汇编语言调用C语言子程序:即由C语言实现子程序,汇编语言实现主程序。

    1.1 C语言调用汇编语言子程序

    首先准备汇编语言子程序,如下(采用了简化段定义方式):
        .386
        .model flat, C
        .STACK
        .CODE
    getmax PROC Param1:SDWORD, Param2:SDWORD
        MOV EAX, Param1
        CMP EAX, Param2
        JG EXIT
        MOV EAX, Param2
    EXIT:
        RET
    getmax  ENDP
        END

    用新的汇编程序ML汇编源文件,格式为:ML /c /coff 源文件名
     这样就会生成一个Win32下支持的格式的obj文件

     成功生成 ok.obj

    在VC6中创建一个项目,添加C语言源文件到项目,再把汇编生成obj文件也添加到项目(跟源文件一样),然后编译即可。

    extern  int getmax(int a, int b);
    #include <stdio.h>
    int main(int argc, char* argv[])
    {
        int m = getmax(12, 8);
        printf("%d",m);
        return 0;
    }

    如何添加OBJ文件:

    方式一: 右键你创建的项目添加文件到工程即可正常链接

    方式二: 工程选项》设置

     将刚才的ok.obj 这个可以是你的汇编程序生成的任何obj文件,添加到

     注意:ok.obj 必须在当前工程的目录下

     运行

    1.2汇编语言调用C语言子程序

      在VC6下编译c程序为obj或lib(注意在C++下定义C函数要加extern “C”前缀表明是一个C语言函数,而不是C++);

     在汇编里使用proto申明c函数的原型,使用invoke伪指令调用c函数;

      声明调用者代码:

    .386
    .model flat, stdcall
    printf          PROTO C param1:ptr sbyte, param2:vararg ; 声明调用函数
    .data
    szMsg           byte    'Hello World!', 0ah, 0
    .code
    start:
                    mov    eax, OFFSET szMsg
                    invoke printf, eax
                    ret
            end             start

    用新的汇编程序ML汇编源文件,格式为:ML /c /coff 汇编程序文件名

    用link32.exe将编译c程序生成的obj/lib与汇编生成的obj文件链接在一起即可,格式如下:

    link32 汇编生成的obj文件名 c程序生成的obj/lib文件 /subsystem:console
    如果直接调用C语言库函数,直接连接msvcrt.lib文件
    例如:
    link32 testmix.obj msvcrt.lib /subsystem:console
    /subsystem:console表示生成的控制台程序,不是图形窗口程序

    C语言调用者程序:

    extern  int getmax(int a, int b);
    int main(int argc, char* argv[])
    {
        int m = getmax(12, 8);
        printf("%d",m);
        return 0;
    }

    2: X86汇编指令嵌入法

    指令意思差异还是很大的

  • 相关阅读:
    Android开发笔记(十八)——Toast
    20199303 2019-2020-2 《网络攻防实践》综合实践
    20199303 2019-2020-2 《网络攻防实践》第12周作业
    20199303 2019-2020-2 《网络攻防实践》第10周作业
    20199303 2019-2020-2 《网络攻防实践》第8周作业
    20199303 2019-2020-2 《网络攻防实践》第7周作业
    20199303 2019-2020-2 《网络攻防实践》第6周作业
    20199303 2019-2020-2 《网络攻防实践》第5周作业
    20199303 2019-2020-2 实践三网络嗅探与协议分析实践
    Deleting comments in c or java code by awk scripts
  • 原文地址:https://www.cnblogs.com/dgwblog/p/11958065.html
Copyright © 2011-2022 走看看