i11usi0n
驱动牛犊
驱动牛犊
  • 注册日期2002-04-18
  • 最后登录2006-05-22
  • 粉丝0
  • 关注0
  • 积分81分
  • 威望10点
  • 贡献值0点
  • 好评度7点
  • 原创分0分
  • 专家分0分
阅读:1643回复:4

如何在c文件中使用汇编语言定义的函数

楼主#
更多 发布于:2005-02-19 15:43
如我用汇编写了一个全局的函数_XXX PROC
将这个汇编文件引入到我的工程中
在一个c.c文件中申明extern void XXX(void);
但是在编译的linker阶段,系统报错,
Undefined symbol _XXX in moduls c.c
使用的是borland c++编译器
下面是.asm文件和应用的.c文件中的文本
*****************************XMSAPI*************************
.model small
.code
org 256
s: push cs
pop ds
call t
db 'ѥ$'
t: pop dx
mov ah,9
int 33
mov ah,76
int 33
end s
------------------------------------------------
  DOSSEG

.MODEL  LARGE, C

; XMMS data structure (eXtended Memory Move Structure)
; ----------------------------------------------------
eXtMemMoveStruct    STRUC
  MoveLength    dw ?,?   ;
  SourceHandle  dw ?     ;
  SourceOffset  dw ?,?   ;
  DestHandle    dw ?     ;
  DestOffset    dw ?,?   ;
eXtMemMoveStruct    ENDS


.DATA

XMScontroladr  DD  ?      ;
xmms  eXtMemMoveStruct <> ;


.CODE

public XMSinstall
public XMSallocblock
public XMSmoveblock
public XMSfreeblock

; int XMSinstall(void);
;----------------------
XMSinstall     PROC FAR
mov    ax,4300h
int    2fh
cmp    al, 80h      ;
jne    NoXMSdriver
call   XMScontrol
        mov    ax, 1        ;
retf
NoXMSdriver:
mov    ax, 0        ;
retf
XMSinstall    ENDP

; int XMScontrol(void);  (return value don't care)
;-------------------------------------------------
XMScontrol  PROC NEAR
mov    ax,4310h
int    2fh       ;
mov    word ptr[XMScontroladr],   bx   ;
mov    word ptr[XMScontroladr+2], es   ;
retn
XMScontrol   ENDP

; int XMSallocblock(unsigned Ksize,unsigned *handle);
;----------------------------------------------------
XMSallocblockpara STRUC
               DW      0, 0
               DW      0
alcblksksize   DW      ?    ; "call by value" °&#1148;&#269;
alcblkshdl     DD      ?    ; "call by reference" °&#1148;&#269;
XMSallocblockpara ENDS

XMSallocblock PROC FAR

        push    bp
        mov     bp,sp

        mov     ah,09h
        mov     dx, alcblksksize[bp]
call    [xmscontroladr]   ;

        lds     bx, alcblkshdl[bp] ;get the address
        mov     [bx],dx     ;set the number of handle.

        pop     bp
        ret         ;ax == 0001 if allocated, else otherwise

XMSallocblock  ENDP

; int XMSmoveblock(long     length,
;                  unsigned srchdl,
;                  long     srcofs,
;                  unsigned dsthdl,
;                  long     dstofs
;                 );
; ---------------------------------
XMSmoveblock  PROC FAR USES ds si,lng:DWORD,shdl:WORD,sofs:DWORD,dhdl:WORD,dofs:DWORD

        les    ax, lng
        mov    xmms.MoveLength,     ax
        mov    xmms.MoveLength+2,   es  ;Intel DWORD notation

        mov    ax,  shdl
        mov    xmms.SourceHandle,   ax

        les    ax, sofs
        mov    xmms.SourceOffset,   ax
        mov    xmms.SourceOffset+2, es  ;Intel DWORD notation

        mov    ax,  dhdl
        mov    xmms.DestHandle,   ax

        les    ax, dofs
        mov    xmms.DestOffset,     ax
        mov    xmms.DestOffset+2,   es   ;Intel DWORD notation

mov    ah, 0Bh           ;
mov    si, OFFSET xmms   ;
call   [XMScontroladr]   ;
        ret
XMSmoveblock  ENDP


; int XMSfreeblock(unsigned handle);
;-----------------------------------
XMSfreeblock  PROC FAR handle:WORD
        mov    ah,0Ah
        mov    dx, handle
call   [XMScontroladr]
        ret            ;1 is free,  0 otherwise
XMSfreeblock  ENDP

        END
;--------------------------------------------------------------
; FILE : XMSAPI.ASM            XMS API function
;--------------------------------------------------------------
  DOSSEG

.MODEL  LARGE, C

; XMMS data structure (eXtended Memory Move

**************************helpcc.c***********************
/******** External Functions -- Define in File XMSAPI.ASM **********/
extern int XMSinstall(void);
extern int XMSallocblock(unsigned blocksize,unsigned *handle);
extern int XMSfreeblock(unsigned handle);
extern int XMSmoveblock(long length, unsigned srchdl, long srcofs,
 unsigned dsthdl, long dstofs);
***************************error inf***********************
Undefined symbol _XMSinstall in moduls helpcc.c
Undefined symbol _XMSallocblock in moduls helpcc.c
Undefined symbol _XMSfreeblock in moduls helpcc.c
Undefined symbol _XMSmoveblock in moduls helpcc.c

我要怎么设置才能成功??

[编辑 -  2/21/05 by  i11usi0n]
liuhaochuan
驱动牛犊
驱动牛犊
  • 注册日期2003-12-22
  • 最后登录2013-12-04
  • 粉丝0
  • 关注0
  • 积分10分
  • 威望1点
  • 贡献值0点
  • 好评度1点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2005-03-06 22:26
我猜应该要把汇编函数编译好以后的obj文件放在C LINK能找到的地方。
liuhaochuan
驱动牛犊
驱动牛犊
  • 注册日期2003-12-22
  • 最后登录2013-12-04
  • 粉丝0
  • 关注0
  • 积分10分
  • 威望1点
  • 贡献值0点
  • 好评度1点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2005-03-06 22:27
另外link的时候要申明包含汇编obj文件
seahawk
驱动牛犊
驱动牛犊
  • 注册日期2005-02-13
  • 最后登录2006-03-08
  • 粉丝0
  • 关注0
  • 积分9分
  • 威望2点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
地板#
发布于:2005-03-07 00:06
如我用汇编写了一个全局的函数_XXX PROC
将这个汇编文件引入到我的工程中
在一个c.c文件中申明extern void XXX(void);
但是在编译的linker阶段,系统报错,
Undefined symbol _XXX in moduls c.c
使用的是borland c++编译器
下面是.asm文件和应用的.c文件中的文本
*****************************XMSAPI*************************
.model small
.code
org 256
s: push cs
pop ds
call t
db \'&#1125;$\'
t: pop dx
mov ah,9
int 33
mov ah,76
int 33
end s
------------------------------------------------
  DOSSEG

.MODEL  LARGE, C

; XMMS data structure (eXtended Memory Move Structure)
; ----------------------------------------------------
eXtMemMoveStruct    STRUC
  MoveLength    dw ?,?   ;
  SourceHandle  dw ?     ;
  SourceOffset  dw ?,?   ;
  DestHandle    dw ?     ;
  DestOffset    dw ?,?   ;
eXtMemMoveStruct    ENDS


.DATA

XMScontroladr  DD  ?      ;
xmms  eXtMemMoveStruct <> ;


.CODE

public XMSinstall
public XMSallocblock
public XMSmoveblock
public XMSfreeblock

; int XMSinstall(void);
;----------------------
XMSinstall     PROC FAR
mov    ax,4300h
int    2fh
cmp    al, 80h      ;
jne    NoXMSdriver
call   XMScontrol
        mov    ax, 1        ;
retf
NoXMSdriver:
mov    ax, 0        ;
retf
XMSinstall    ENDP

; int XMScontrol(void);  (return value don\'t care)
;-------------------------------------------------
XMScontrol  PROC NEAR
mov    ax,4310h
int    2fh       ;
mov    word ptr[XMScontroladr],   bx   ;
mov    word ptr[XMScontroladr+2], es   ;
retn
XMScontrol   ENDP

; int XMSallocblock(unsigned Ksize,unsigned *handle);
;----------------------------------------------------
XMSallocblockpara STRUC
               DW      0, 0
               DW      0
alcblksksize   DW      ?    ; \"call by value\" °&#1148;&#269;
alcblkshdl     DD      ?    ; \"call by reference\" °&#1148;&#269;
XMSallocblockpara ENDS

XMSallocblock PROC FAR

        push    bp
        mov     bp,sp

        mov     ah,09h
        mov     dx, alcblksksize[bp]
call    [xmscontroladr]   ;

        lds     bx, alcblkshdl[bp] ;get the address
        mov     [bx],dx     ;set the number of handle.

        pop     bp
        ret         ;ax == 0001 if allocated, else otherwise

XMSallocblock  ENDP

; int XMSmoveblock(long     length,
;                  unsigned srchdl,
;                  long     srcofs,
;                  unsigned dsthdl,
;                  long     dstofs
;                 );
; ---------------------------------
XMSmoveblock  PROC FAR USES ds si,lng:DWORD,shdl:WORD,sofs:DWORD,dhdl:WORD,dofs:DWORD

        les    ax, lng
        mov    xmms.MoveLength,     ax
        mov    xmms.MoveLength+2,   es  ;Intel DWORD notation

        mov    ax,  shdl
        mov    xmms.SourceHandle,   ax

        les    ax, sofs
        mov    xmms.SourceOffset,   ax
        mov    xmms.SourceOffset+2, es  ;Intel DWORD notation

        mov    ax,  dhdl
        mov    xmms.DestHandle,   ax

        les    ax, dofs
        mov    xmms.DestOffset,     ax
        mov    xmms.DestOffset+2,   es   ;Intel DWORD notation

mov    ah, 0Bh           ;
mov    si, OFFSET xmms   ;
call   [XMScontroladr]   ;
        ret
XMSmoveblock  ENDP


; int XMSfreeblock(unsigned handle);
;-----------------------------------
XMSfreeblock  PROC FAR handle:WORD
        mov    ah,0Ah
        mov    dx, handle
call   [XMScontroladr]
        ret            ;1 is free,  0 otherwise
XMSfreeblock  ENDP

        END
;--------------------------------------------------------------
; FILE : XMSAPI.ASM            XMS API function
;--------------------------------------------------------------
  DOSSEG

.MODEL  LARGE, C

; XMMS data structure (eXtended Memory Move

**************************helpcc.c***********************
/******** External Functions -- Define in File XMSAPI.ASM **********/
extern int XMSinstall(void);
extern int XMSallocblock(unsigned blocksize,unsigned *handle);
extern int XMSfreeblock(unsigned handle);
extern int XMSmoveblock(long length, unsigned srchdl, long srcofs,
 unsigned dsthdl, long dstofs);
***************************error inf***********************
Undefined symbol _XMSinstall in moduls helpcc.c
Undefined symbol _XMSallocblock in moduls helpcc.c
Undefined symbol _XMSfreeblock in moduls helpcc.c
Undefined symbol _XMSmoveblock in moduls helpcc.c

我要怎么设置才能成功??

[编辑 -  2/21/05 by  i11usi0n]


我认为是因为函数名的原因,
c和c++的函数名在库里都不是直接使用原名的,
比如一个c函数void a(int i){}的真实名称应该叫_a@xxx,
c和c++命名规则还不一样,我看到你在汇编中命名的时候没有按照这个规则命名,问题应该就出在这里了。
你要解决这个问题,应该遵循如下顺序:
1。决定以c还是以c++方式调用汇编函数(建议用c模式)
2。找到这种方式的命名规则,网上应该很多这样的资料
3。写一个头文件,申明时明确表示用那种模式(c还是c++)

当然还有一点千万别忘了,就是函数的三种调用模式,在头文件中申明一下就可以了,但在汇编中需要自己实现,这是一个有可能忽视的地方。
傍海渔村酣睡足 斜阳一脉洒千山 鲲鹏不待风潮起 万古江山多寂寥
smallant
驱动牛犊
驱动牛犊
  • 注册日期2005-01-16
  • 最后登录2005-04-19
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2005-03-07 08:45
seahawk同志说的对。
游客

返回顶部