资源描述:
《C语言与汇编语言混合编程 嵌入式汇编》由会员上传分享,免费在线阅读,更多相关内容在工程资料-天天文库。
1、C语言如何跟汇编语言混用啊?我从来没有听过有这样用的,如果真的有的话请大家说来听听,我很想知道是什么回事!按照TC2.0的帮助系统所以说的,在TC2.0下是可以用汇编的,方法是使用asm关键字:其格式是:asmopcode<;newline>,如同别的注释一样,<>之间的表示可选的;例如:main(){char*c="hello,worldr$";asmmovah,9;asmmovdx,c;asmint33;printf("Yousucessed!");}或者是:main(){char*c="hello,world
2、r$";asmmovah,9asmmovdx,casmint33printf("Yousucessed!");}两种格式其实是一种.如果你用的是第一种的样式,记住:每一句汇编语句都要以asm开头,如果一行内有多个句子,那么千万不要忘记在两个句子之间的这个semicolon(分号),但是最后一句汇编后面(如果后面没有其它的语句)的分号可有可无,象第一个例子中的asmint33;后面的分号就可以不要,因为它的后面没有其它的语句了.但如果是这样:asmmovah,9;asmmovdx,c;asmint33;printf("Yousucessed
3、!");那么asmint33;后面的分号便还是留下好,以免出现编译错误!在这一点上颇象C语言.还有一种格式是asm{assemblylanguagestatement},这种格式应该被普遍的欢迎.它们的例子如下(其中的语句排列格式与上面两种相同):asm{movax,var1addax,var2......}但是要注意这种格式TC2.0是不支持的!只有后来的TC++3.0及后来的IDE支持!工具的使用:一旦你的C源文件里包括了这些好东西,则必须用TCC.EXE的COMMAND-LINE来编译,具体的命令参数TCC.EXE已经提供,这里不复阐述了
4、.最简单的是:TCCC源文件名(使用这个方法,TCC会自动调用TASM.EXE和TLINK.EXE,并且能够使TLINK.EXE正确的找到需要的.obj和.lib文件,如果你单步编译的话,可能会碰到很多的问题,主要是TLINK.EXE它自己并不会去找.obj和.lib文件,你自己可以建一个.bat文件,如果要指定.lib文件的目录的话可以用/L参数,在文章的后面有一个例子).但大家要注意了,看一下你的TC目录下面到底是否有TASM.EXE文件,并在TURBOC.CFG(这个文件包括TCC.EXE运行期参数,这里面所有参数在运很期都将被自动TCC
5、.EXE使用,例如:-IH:TCINCLUDE-LH:TCLIB)文件中设置好一些参数,并确认TASM.EXE的版本号要2.0以上,以及是否能够向下兼容.但是在大多数的情况下TC的目录是没有TASM.EXE的,或是版本不正常.如果你有TASM.EXE文件并且TURBOC.CFG文件也已经写好了,但是还要注意一个问题:运行TCC.EXE时要在独立的DOSSHELL下面(不要害怕,这不是一个新东西,我的意思是,不在诸如TC下的DOSSHELL下面运行,我曾经败在这个问题下,当我发现时直想揍电脑一顿,还好没有,不然就没有这篇文件了.)还有
6、一句重要的话:TC2.0支持大部分8086指令(当然用法有一些约定,不过现在我并不打算进行详细说明,因为那是一件很繁杂的事,以后有时间或许会写出来----如果大家需要的话).如果说上面我所说的那些约定很繁杂的话,那么下面的方法该是多么简单啊!让我们使用Borland为TC2.0内建的变量来进行伪汇编.或许你还不知道在TC2.0中还有一些内建的pseudo寄存器(可以看作是register型的变量,但是它们比register型的变量好用的多)_AX,_AH,_AL,_BX,_BH,_BL,_CX,_CH,_CL,_DX,_DH,_DL,_DI,_
7、SI,_SP,_CS,_DS,_ES,_SS注意这些寄存器的size,_AX,_BX,_CX,_DX,_CS,_DS,_ES,_SS,_SI,_DI,_SP等都是16位的寄存器相当于C语言的unsignedint类型,其余的都是8位的寄存器(相当于unsignedchar)(TC怎么可能支持32位的寄存呢,所以EAX等是不能用的,FS,GS和IP寄存器都是无效的),还有就是在传递参数的时候千万不要忘记使用强制类型转换.中断调用指令是:__int__(interrupt_#)(注意int的前辍和后辍都是两个underscores)Forexamp
8、le:#includeunsignedint_stklen=0x200;unsignedint_heaplen=0;main(){_DX