阅读:1643回复:4
如何在c文件中使用汇编语言定义的函数
如我用汇编写了一个全局的函数_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" °Ѽč alcblkshdl DD ? ; "call by reference" °Ѽč 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] |
|
沙发#
发布于:2005-03-06 22:26
我猜应该要把汇编函数编译好以后的obj文件放在C LINK能找到的地方。
|
|
板凳#
发布于:2005-03-06 22:27
另外link的时候要申明包含汇编obj文件
|
|
地板#
发布于:2005-03-07 00:06
如我用汇编写了一个全局的函数_XXX PROC 我认为是因为函数名的原因, c和c++的函数名在库里都不是直接使用原名的, 比如一个c函数void a(int i){}的真实名称应该叫_a@xxx, c和c++命名规则还不一样,我看到你在汇编中命名的时候没有按照这个规则命名,问题应该就出在这里了。 你要解决这个问题,应该遵循如下顺序: 1。决定以c还是以c++方式调用汇编函数(建议用c模式) 2。找到这种方式的命名规则,网上应该很多这样的资料 3。写一个头文件,申明时明确表示用那种模式(c还是c++) 当然还有一点千万别忘了,就是函数的三种调用模式,在头文件中申明一下就可以了,但在汇编中需要自己实现,这是一个有可能忽视的地方。 |
|
|
地下室#
发布于:2005-03-07 08:45
seahawk同志说的对。
|
|