c和汇编混用.doc_第1页
c和汇编混用.doc_第2页
c和汇编混用.doc_第3页
c和汇编混用.doc_第4页
c和汇编混用.doc_第5页
已阅读5页,还剩14页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

c和汇编混用编程爱好者网站最新推出 Borland开发工具讨论专区 微软开发工具讨论专区 合作开发:为您提供一个项目合作交流的平台。寻找适合志同道合的朋友共同参与开发。招聘求职:为您提供人才交流的平台。 设为首页 加入收藏会员注册 网站留言光盘刻录服务 2003年8月31日 星期日二手书籍交流 首页 新闻中心 文档中心 下载中心 源码中心 刻盘服务 网友作品 电子杂志 编程论坛 合作开发 招聘求职 二手书籍 项目交易 文件上传 高手通讯录 网站留言 请登陆或者注册新用户 用户名 密 码 记住密码 注册新用户 忘记密码了 您所在位置:编程爱好者论坛 汇编语言讨论区 C语言如何跟汇编语言混用啊? 全部 精华贴 热门贴 未回复帖 点这里跳转到其他讨论区 站务讨论区 新手入门区 Visual Basic讨论区 C/C+语言讨论区 Visual C+讨论区 C+ Builder讨论区 Delphi讨论区 Visual Foxpro讨论区 Powerbuilder讨论区 PASCAL语言讨论区 Java讨论区 游戏开发讨论区 汇编语言讨论区 .net开发讨论区 WINAPI讨论区 软件创意区 编程软件下载区 数据库开发讨论区 JBuilder讨论区 ASP讨论区 PHP讨论区 JSP讨论区 网站制作讨论区 程序员人生 程序员考试交流区 算法研讨区 光盘刻录服务区 Simple Vote讨论区 招聘求职区 二手书籍交流区 论坛新手必读 诚征各讨论区版主 Borland开发讨论专区 微软开发讨论专区 专家分制度 关注本贴 打印本页 保存页面 该主题访问数:101 主题:C语言如何跟汇编语言混用啊? 作者:bluesky06专家分:0 会员信息发短消息电子邮件 发表时间:2003-7-15 10:40:55 回复 -楼主 C语言如何跟汇编语言混用啊? 作者:Godking专家分:0 会员信息发短消息 电子邮件 发表时间:2003-7-17 19:42:37 回复 此帖尚未评分 -第1楼 我从来没有听过有这样用的,如果真的有的话请大家说来听听,我很想知道是什么回事! 作者:doveling专家分:40 会员信息发短消息 电子邮件 发表时间:2003-7-20 21:30:07 回复 此帖尚未评分 -第2楼 按照TC2.0的帮助系统所以说的,在TC2.0下是可以用汇编的,方法是使用asm关键字:其格式是:asm opcode ,如同别的注释一样,之间的表示可选的;例如:main() char *c=hello,worldnr$; asm mov ah,9;asm mov dx,c;asm int 33;printf(You sucessed!n);或者是:main() char *c=hello,worldnr$;asm mov ah,9asm mov dx,c asm int 33printf(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,这种格式应该被普遍的欢迎.它们的例子如下(其中的语句排列格式与上面两种相同): asmmov ax,var1add 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:TCINCLUDE-LH:TCLIB)文件中设置好一些参数,并确认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的前辍和后辍都是两个underscores)For example:#includeunsigned int _stklen=0x200;unsigned int _heaplen=0;main()_DX=(unsigned int)Hello,world.rn$;_AX=0x900;_int_(0x21);dos.h它是包含_int_()内建中断调用语句的头文件,因此是不可缺少的._stklen和_heaplen是定义运行期堆栈和堆大小的两个内部引用变量(这是个我自己想的名词,意指如果这两个变量在源文件中显式的声明了,那么编译程序会自会引用来构造编译时期的信息以产生用户希望的目标文件,如果不显式的声明则编译程序自动确定).这两个变量也有一些约定,如果_stklen不显式声明,_heaplen赋值为零都表示栈和堆都是defult的.最后在TC2.0中还有一个没有说明的标志位寄存器flags,它也是内建pseudo寄存器是:_FLAGS,是一个16位寄存器.这些内建的寄存器都可以进行运算,但是要注意它们所代表的类型(必要时进行类型转换);看起来这是不是一种好的办法啊(而且使用这种方法只要用个一个dos.h头文件就好,不需要用TCC编译,可以直接在TC20的IDE下编译).TC2.0中也提供了一些简单好用的函数来实现对DOS功能的调用如:int86(.),int86x(.)(但是这些方法实际仍然要调用函数,所以不如使用伪寄存器,又因为要牵涉到union REGS结构的内存分配所以系统的开销是增大了,而使用伪寄存器是最简洁的),端口通信函数如:inportb(.),inport(.),outportb(.),outport(.),指针转换函数:FP_OFF,FP_SEG,MK_FP,这些函数在帮助系统中都有,有用时大家可以查阅.tlinkbat.bat的例子:rem The lib environment variable is the directory of the .obj and .lib fileset lib=h:tclibrem 这下面的句子中的c0s(C 零S)是一个.OBJ文件,是一个C程序的STARTUP文件tlink %lib%c0s %1,%1,%1,/L%lib%emu.lib %lib%maths.lib %lib%cs.lib set lib=(使用时可将以rem开头的句子删除)_一些约定:我们先说一下在TC20下写汇编(内联汇编-自己起的名字,大家可以想叫什么叫什么)时的编译器的编译原则:1.所有在main()函数外的的汇编语言的语句都作为数据声明语句处理,也即在编译器编译时会将它放在数据段中,如:asm string1 db Hello,world!,0ah,0xd,$ main()asm mov dx,offset string1asm mov ah,9asm int 33asm mov dx,offset string2asm int 33 asm string2 db the string can be declared after the main() function!$象这些样子在main()外面的汇编语言的数据定义语句(事实上不管是什么汇编语句,只要是在main()之外,包括这个句子:asm mov ax,0x4c00),在编译后都放在数据段中,而C语言的数据声明语句仍按C的规则!2.所有在main()函内的汇编语言的语句在编译后都放在代码段中,包括这个句子:asm string2 db the string can be declared after the main() function!$3.不要在以asm 开头的语句中使用C语言的关键字,这会导致编译阶段的错误那么,根据这三条大家会得到什么样的结论呢?(先闭上眼想一想,你可能会由此变的很赞赏自己,是的你应该这样相信自己是对的!)让我们一起看一下这个结论:1.根据编译原则1得到:不可以在main()外面写汇编命令语句(不要笑,正是与C语言相同才值得注意!),在任何地方都不要进行任何的段定义和宏定义(这是因为编译后的形式决定的,也即:在TC20下所有的汇编格式的语句只能是,直接性的数据定义和语句指令)!2根据编译原则2得到:不可以在main()之内使用汇编的语句进行数据定义(同样不要笑,大多数人在第一次在TC20下写汇编都会有这样的错误的)3.如同类强制类型这样的事是不可以在以asm开头的汇编语句中使用的好了,天即朗,气瞬清!这样一说,一个大体的框架就出来了!只要遵守这个原则写,就可避免很多莫名其妙的错误出现!通俗的说:汇编语句的数据定义放在main()外面,指令放在main()里面.如果你没有更好的文档,那么记住我的这些话!一些细节的问题:在以asm开头的内联汇编语句中是不支持C的转义字符的,但是用C语言声明一个字符数组(含有转义字符的),然后用int 33 ah=9这功能时输出这个字符串时,其中的转义字符是有效的(这主要是因为编译后其内部表示形式不同造成的,自己想想会有答案的).内联汇编支持C的一些如数值表示,字符串声明格式等,如:一个十六进制的数据可以用两种方式表示:0xa 和0ah,字符串可以是这样:Hello,world!$(如同C)也可以这样Hello,world!$(用汇编自己的方式).象C一样你同样要注意赋值的类型,而且要比C更严格(汇编从来不自己动手做如同类型转换啊这样事),所以一切的事完全要你自己做好!而且你不要企图以C的形式 做这件事,如这样的格式 asm mov dx,(unsigned)a(a是一个这样的东西,char a =hello,world!;),而且这样句子也会导致错误:asm mov dx,word ptr a(逻辑错误),不过这不是在编译时的错误,而是运行期的错误(具体的原因自己想一想,象word label这样的东西的运算作用和会导致的后果),你可以这样用一个句子做中间人如int i=(unsigned)a;asm mov dx,i(也千万不要用asm mov dx,(unsigned)a 这样的句子.但是,告诉大家一个好消息,你可以用指针指向一个字符串,然后你会惊讶你竟然可以这样:char *p=hello,world;asm mov dx,p,然后用int 33 ah=9的功能输出这个字符串而不会有错误(这也表现出指针的特点,它是一个二字节的(TC20下)变量,含有的是一个地址,这与其指向的变量的类型是毫无关系的).内汇汇编语句不支持-这个运算符.还有标号的问题,在最后的例子中你会年看到一些特别之处!上面所说的只是很细小并微少的一些事(也是很常遇到的),尚有很多的细节要说,但由于本人时间有限不能一一列举,如C的结构在内联汇编的应用等大家可以按照其运行机理去想想一下用法;另外,由于这只是一件学习的事,所以还是大家自己学(找一下有关文档,当然现在已经没有什么比较完整的了),情况会好的多,我在对内联汇编的学习过程中领会到了不少的东西,例如编译原理方面的知识,以及如何做会使代码更高效,占空间最少等的方法.最后向大家推荐一种方法,在利用TCC的-S开关可以生成C源文件的汇编代码(或许很多的人都用过)是很好的学习材料!祝大家学有所成!Cstarter02-11-17/* 由于个人的时间和能力有限,难免有错误和不详细的地方,请大家见谅!My Email: C QQ:170594633 */一些例子:下面这个例子是对沈美明 温冬婵的清华版第十一章程序的改写可直接在命令行上键入 tcc filename 就可以,当然你要有TASM.EXE/*asm mus_frep dw 330,294,262,294,3 dup(330)asm dw 3 dup(294),330,392,392asm dw 330,294,262,294,4 dup(330)asm dw 294,294,330,294,262,-1asm mus_time dw 6 dup(25),50asm dw 2 dup (25,25,50)asm dw 12 dup(25),100*/asm mus_frep dw 330,392,330,294,330,392,330,294,330asm dw 330,392,330,294,262,294,330,392,294asm dw 262,262,220,196,196,220,262,294,330,262asm dw -1asm mus_time dw 3 dup (50),25,25,50,25,25,100asm dw 2 dup (50,50,25,25),100asm dw 3 dup (50,25,25),100 main()asm jmp start/*设置发声的频率,这一段在沈美明 温冬婵的清华版第十一章有详细的说明 */sound:asm mov al,0b6hasm out 43h,alasm mov dx,12hasm mov ax,533h*896asm div diasm out 42h, alasm mov al,ah/* 这个延时是用来防止两次IO操作的最后一次操作的错误,因为CPU比总线的速度快很多,所以 要延时等待第一次操作完成后再进行第二次操作*/asm mov cx,1000delay:asm loop delayasm out 42h,alasm in al,61hasm mov ah,alasm or al,3asm out 61h,al/* 使用中断15H功能86H延时CX:DX=微秒数*/asm mov ax,2710hasm mul bxasm mov cx,dxasm mov dx,axasm mov ah,86hasm int 15h /*可用_int_(0x15);代替*/asm mov al,ahasm out 61h,alasm jmp add_count/*-*/start:asm mov si,offset mus_frepasm lea bp,mus_timefrep:asm mov di,siasm cmp di,-1asm je end_musasm mov bx,bpasm jmp soundadd_count: /*标号不能用汇编语言写*/asm add si,2asm add bp,2asm jmp frepend_mus:;对于上面的程序大家可用伪寄存器的方法写一个,要容易的多!/*一个发声程序!(引自电力版-这个版不好,不如清华版的)*/#includedos.hmain()static union REGS ourregs;outportb(0x43,0xb6);outportb(0x42,0xee);outportb(0x42,0);outportb(0x61,(inportb(0x61)|0x03);ourregs.h.ah=0x86;ourregs.x.cx=0x001e;ourregs.x.dx=0x8480;int86(0x15,&ourregs,&ourregs);outportb(0x61,(inportb(0x61)&0xfc); 作者:sonicbb专家分:80 会员信息发短消息 电子邮件 发表时间:2003-7-20 23:24:17 回复 此帖尚未评分 -第3楼 在C语言中嵌汇编与编译器的设计联系非常紧密,可以说,只有编译器的设计者才能告诉你如何在C语言中潜入汇编。所以,只要你去找编译器的文档,就一定可以找到。关于C中的汇编格式楼上已经拿TC举了个详细的例子。为了说明我的观点,我拿Metrewerks的CodeWarrior中嵌汇编的格式再举个例子格式有两种:1)汇编

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论