上面讲了一个例子,使用的是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
待续。。。。。
视频教程列表
文章教程搜索
C语言程序设计推荐教程
C语言程序设计热门教程
|