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结束 0
相关文章
读者评论
发表评论 |