C语言与汇编语混合编程 嵌入式汇编.docVIP

  • 6
  • 0
  • 约1.32万字
  • 约 7页
  • 2016-10-19 发布于贵州
  • 举报
C语言与汇编语混合编程 嵌入式汇编

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

文档评论(0)

1亿VIP精品文档

相关文档