专注于互联网--专注于架构

最新标签
网站地图
文章索引
Rss订阅

首页 »C语言教程 » tc2.0:TC2.0中怎样调用汇编程序(02) »正文

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

来源: 发布时间:星期四, 2008年9月25日 浏览:46次 评论:0
上面讲了一个例子,使用的是small模式。
可以看到汇编语言的基本格式为:

PUBLIC _FOUND
_TEXT SEGMENT BYTE PUBLIC \'CODE\'
ASSUME CS: _TEXT
_FOUNDPROC NEAR
PUSHBP
MOVBP,SP
MOVCX,[BP+4]
DECCX
MOVSI,[BP+10]
LODSW
MOVDX,1
MOVBX,0
COMP:CMPAX,[SI]
JABIGGER
MOVAX,[SI]
MOVBX,DX
BIGGER:INCSI
INCSI
INCDX
LOOPCOMP
MOVDI,[BP+6]
MOV[DI],AX
MOVDI,[BP+8]
MOV[DI],BX
POPBP
RET
_FOUNDENDP
_TEXTENDS
END

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

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

下面是代码段的组成:
_TEXT SEGMENT BYTE PUBLIC \'CODE\'
................
_TEXT ENDS
下面是函数的组成:
_FOUND PROC NEAR
.............
_FOUND ENDP

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

}
在这个C函数中,什么代码也没有,只是一个空的框架,我们就用这个框架程序让TC生成一个该程序的汇编代码,看一看TC生成的汇编代码是一个什么样子。
在命令行下进行如下操作:
输入:tcc -S found 回车 /*要注意参数s一定要写成大写,不然会提示错误*/
这时在生成的文件中,有一个found.asm 的汇编代码文件,我们把它打开看一下:(语句后的注释是自己加上的)
ifndef??version
?debugmacro
endm
endif
?debugS \"found.c\"
_TEXTsegmentbyte public \'CODE\'
DGROUPgroup_DATA,_BSS
assumecs:_TEXT,ds:DGROUP,ss:DGROUP
_TEXTends
_DATAsegment word public \'DATA\'
d@labelbyte
d@wlabelword
_DATAends
_BSSsegment word public \'BSS\'
b@labelbyte
b@wlabelword
?debugC E9943D8F2E07666F756E642E63
_BSSends
_TEXTsegmentbyte public \'CODE\' ; _TEXT 标识符的段码段
?debugC E80007666F756E642E63943D8F2E
?debugL 1
_foundprocnear; 函数found 用下划线标识, _found从这里开始
?debugB
pushbp
movbp,sp
?debugC E318000200150404
?debugC E60173180A0A00016B180A0800016A180A060001+
?debugC 69040A0400
?debugB
@1: ;从这里开始加入我们自己的汇编代码
?debugL 3
popbp
ret
?debugC E60173180A0A00016B180A0800016A180A060001+
?debugC 69040A0400
?debugE
?debugE
_foundendp ; 函数_found结束
标签:wintc2.0 tc2.0

相关文章

读者评论

  • 共0条 分0页

发表评论

  • 昵称:
  • 内容: