现在的位置: 首页 > 综合 > 正文

在DOS汇编中调用C语言库函数

2013年09月11日 ⁄ 综合 ⁄ 共 989字 ⁄ 字号 评论关闭

    调用C库函数,需要c0x.obj和cx.lib,其中x表示编译模式的首字符,如果是小模式samll,这两个文件就是c0s.boj和cs.lib,注意c0s.obj中间是数字零不是字母,c0x.obj是调用库函数前做些初始化工作的,cs.lib是库函数所在的库文件.

下面这个程序使用的是小模式samll

;汇编源程序aboil.asm
.model small,c   
;表示使用小模式并使用C语言函数调用函数,如果只定义.model small,那么调
;用的C函数前要加下划线,如调用printf就要改成_printf.

extrn printf:near    ;用extrn伪指令声明要调用的库函数

data segment word public 'DATA' 
;数据段必须定义成这样,定义类型为word,组合类型为public,段类别为DATA
;这样是为了后面连接程序文件,否则程序无法定位数据

msg db 'hello word!',0     ;C语言中字符串是以零结尾的.

data ends

DGROUP group DATA 
;这句也是必须的,将数据段声明为DGROUP组中

code segment word public 'CODE'  ;同上数据段声明一样,这样是为了连接程序
    assume cs:code,ds:DGROUP
main proc near                        ;你的程序主过程必须为main,这是为了和C语言保持一致
start:
    ;大家注意这里,不要再自己设置数据段地址,mov ax,data   mov ds,ax这就不要了
        lea ax,msg    ;取得字符串偏移地址
        push ax        ;将字符串地址压栈,相当于在C语言中传送字符指针
        call printf        ;调用库函数
        add sp,2      ;清除参数,保持堆栈平衡
        ret            ;返回c0s的代码中,程序做些清理工作才退出
main endp    
code ends
end     start

    先成masm编译aboil.asm成aboil.obj,然后用link文件连接c0x.obj和aboil.obj,调用方法如下:
link c0s+aboil  回车
注意文件名顺序不要搞错了,是c0s在前
然后link提示要连接的库,输入cs.lib
Libraries [.LIB]:cs.lib 回车
得到c0s.exe,运行,就能看到显示hello world!,这时调试下你的程序就知道,生成的程序先是运行一些初始化的指令,然后调用你的程序,然后你的程序调用库函数

抱歉!评论已关闭.