问题讨论:程序 C/C++ Java GUI编程 ASP Php Shell Perl Web开发 软件工程 三大件 机箱 存储设备 光存储 音频设备 视频设备 外设 购机
asp php java C CGI .net vb delphi unix&linux sql Word Excel WPS OutLook Powerpoint Dreamweaver FPage/Golive CSS/HTML DOM/JS
热门词:流程图 excel 入侵检测 vss Windows 安全漏洞 QQ空间 事件编程 MFC

 编程开发 > c语言 

TC2.0中怎样调用汇编程序(02)

[2006-11-3 19:49:28] [来源: 百家电脑学院] [我要投稿]

上面讲了一个例子,使用的是small模式。
可以看到汇编语言的基本格式为:

PUBLIC _FOUND
_TEXT SEGMENT BYTE PUBLIC CODE
ASSUME CS: _TEXT
_FOUND PROC NEAR
  PUSH BP
  MOV BP,SP
  MOV CX,[BP+4]
  DEC CX
  MOV SI,[BP+10]
  LODSW
  MOV DX,1
  MOV BX,0
COMP: CMP AX,[SI]
  JA BIGGER
  MOV AX,[SI]
  MOV BX,DX
BIGGER: INC SI
  INC SI
  INC DX
  LOOP COMP
  MOV DI,[BP+6]
  MOV [DI],AX
  MOV DI,[BP+8]
  MOV [DI],BX
  POP BP
  RET
_FOUND ENDP
_TEXT ENDS
  END

为了看得更清楚,我们把代码去掉,留下基本框架:
PUBLIC _FOUND
_TEXT SEGMENT BYTE PUBLIC CODE
ASSUME CS: _TEXT
_FOUND PROC NEAR
  PUSH   BP
  MOV   BP,SP
  .........             ;从这里开始加入汇编代码
  .........
  POP   BP
  RET
_FOUND ENDP
_TEXT ENDS
  END

这就是在samll(小模式)下的汇编语言接口框架,在加入代码处,写上你所要完成一定功能的汇编代码,就成为一个可供TC调用的汇编模块。
  可以看出,代码段是以带下划线的标识符开头的。
  代码段的标识为_TEXT,由C程序中调用的函数found在这里也是以下划线标出:_FOUND。
 
  下面是代码段的组成:
  _TEXT SEGMENT BYTE PUBLIC CODE
  ................
  _TEXT ENDS
  下面是函数的组成:
  _FOUND PROC NEAR
  .............
  _FOUND ENDP

在small(小模式下,只要按照以上的格式书写汇编代码,就一定能成功地被C程序调用。
为什么是这样的格式而不是别的格式?要是不按照这个格式书写行不行?
  这个格式是TC编译程序所定好了的,如果不按照这个格式书写汇编代码,调用就不会成功。
为了说明这个问题,我们可用一个简单的例子来做一个试验:
void found(int i,int *j,int *k,int *s)
{

}
在这个C函数中,什么代码也没有,只是一个空的框架,我们就用这个框架程序让TC生成一个该程序的汇编代码,看一看TC生成的汇编代码是一个什么样子。
在命令行下进行如下操作:
输入: tcc -S found   回车     /*要注意参数s一定要写成大写,不然会提示错误*/
这时在生成的文件中,有一个found.asm 的汇编代码文件,我们把它打开看一下:(语句后的注释是自己加上的)
ifndef ??version
?debug macro
endm
endif
?debug S found.c
_TEXT segment byte public CODE        
DGROUP group _DATA,_BSS
assume cs:_TEXT,ds:DGROUP,ss:DGROUP
_TEXT ends
_DATA segment word public DATA
d@ label byte
d@w label word
_DATA ends
_BSS segment word public BSS
b@ label byte
b@w label word
?debug C E9943D8F2E07666F756E642E63
_BSS ends
_TEXT segment byte public CODE         ; _TEXT 标识符的段码段
?debug C E80007666F756E642E63943D8F2E
?debug L 1
_found proc near                     ; 函数found 用下划线标识, _found从这里开始
?debug B
push bp
mov bp,sp
?debug C E318000200150404
?debug C E60173180A0A00016B180A0800016A180A060001+
?debug C 69040A0400
?debug B
@1:                             ;从这里开始加入我们自己的汇编代码
?debug L 3
pop bp
ret
?debug C E60173180A0A00016B180A0800016A180A060001+
?debug C 69040A0400
?debug E
?debug E
_found endp                         ; 函数_found结束
_TEXT ends                         ; 代码段结束
?debug C E9
_DATA segment word public DATA
s@ label byte
_DATA ends
_TEXT segment byte public CODE
_TEXT ends
public _found
?debug C EA0109
?debug C E31900000023010000
?debug C EC065F666F756E641918
end

  不需要对上面的这个汇编代码作任何改动,你要做的只是在@1:标识符开始处填上需要完成一定功能的汇编代码,那么一个可以由TC正确调用的汇编函数接口就完成了。
  一般的做法是去掉上面汇编代码中多余的信息(这些信息是TC自动生成),成为看上去很清析的汇编代码,如前所述

PUBLIC _FOUND
_TEXT SEGMENT BYTE PUBLIC CODE
ASSUME CS: _TEXT
_FOUND PROC NEAR
  PUSH   BP
  MOV   BP,SP
  .........             ;从这里开始加入汇编代码
  .........
  POP   BP
  RET
_FOUND ENDP
_TEXT ENDS
  END


待续。。。。。

·TC2.0中怎样调用汇编程序(02) | 相关文章·

·百家学院 | 最新评论·