论坛交流
首页办公自动化| 网页制作| 平面设计| 动画制作| 数据库开发| 程序设计| 全部视频教程
应用视频: Windows | Word2007 | Excel2007 | PowerPoint2007 | Dreamweaver 8 | Fireworks 8 | Flash 8 | Photoshop cs | CorelDraw 12
编程视频: C语言视频教程 | HTML | Div+Css布局 | Javascript | Access数据库 | Asp | Sql Server数据库Asp.net  | Flash AS
当前位置 > 文字教程 > C语言程序设计教程
Tag:新手,函数,指针,数据类型,对象,Turbo,入门,运算符,数组,结构,二级,,tc,游戏,试题,问答,编译,视频教程

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

文章类别:C语言程序设计 | 发表日期:2008-9-24 14:43:15

上面讲了一个例子,使用的是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中怎样调用汇编程序(01) 人气:6586
下一篇:{实例}几个图形(01) 人气:6891
视频教程列表
文章教程搜索
 
C语言程序设计推荐教程
C语言程序设计热门教程
看全部视频教程
购买方式/价格
购买视频教程: 咨询客服
tel:15972130058