首页 C语言内嵌汇编

C语言内嵌汇编

举报
开通vip

C语言内嵌汇编C语言内嵌汇编 在C语言中如何使用汇编语言呢,这个问题在 不同的编译器中,具体实现方法是不同的。不过在实现大方上也不过就是有两种,而且各种编译器的实现方法也是大同小异。一种是在C语言中嵌入汇编语言代码, 另一种是让C语言从外部调用汇编。下面我们就以 Borland格式为例来说一说具体用法。但是,GCC与Microsoft的实现方法的与Borland只在格式上有点区别。当然,GCC的嵌入汇编是 AT&T格式的。还好,不管什么格式,只是表达形式的不同而已,其内在含义是一模一样的。还是那句话各种编译器的实现方法是大同小...

C语言内嵌汇编
C语言内嵌汇编 在C语言中如何使用汇编语言呢,这个问题在 不同的编译器中,具体实现方法是不同的。不过在实现大方上也不过就是有两种,而且各种编译器的实现方法也是大同小异。一种是在C语言中嵌入汇编语言代码, 另一种是让C语言从外部调用汇编。下面我们就以 Borland 格式 pdf格式笔记格式下载页码格式下载公文格式下载简报格式下载 为例来说一说具体用法。但是,GCC与Microsoft的实现方法的与Borland只在格式上有点区别。当然,GCC的嵌入汇编是 AT&T格式的。还好,不管什么格式,只是 关于同志近三年现实表现材料材料类招标技术评分表图表与交易pdf视力表打印pdf用图表说话 pdf 达形式的不同而已,其内在含义是一模一样的。还是那句话各种编译器的实现方法是大同小异的,并没有本 质的区别。另外在最后还附带了一篇介绍在GCC中使用内嵌汇编的文章。 一、两种实现方式 首先,我们看一看在C语言中如何嵌入汇编语言代码。在C语言中嵌入汇编语言代码,也有两种格式,一种是单句的,一种是模块的。 我们来看看一些简单的例子。 例子1: 单句格式的: main() , asm mov ah,2; asm mov bh,0; asm mov dl, 20; asm mov dh,10; asm int 10h; /*调用BIOS中断设置光标位置*/ , 模块格式的: main() , asm, mov ah,2 mov bh,0 mov dl, 20 mov dh,10 int 10h , , 在这个小程序里面并没有突出“嵌入”二字。不过从这个程序中可以看出其基本 格式。嵌入的各行代码前面加上asm关键字或者把汇编语句放入asm代码块中, 每行以分号或换行符结束,而注释必须是C语言格式的。 下面我们来看一个让C语言和汇编协作的例子: 例子2: main() { char const *MESSAGE=”OutPut from asm..\n$”; asm{ mov ah, 9 mov dx, MESSAGE int 21h } } 上面这个例子十分的简单,它的纯C语言版本是: ,i nclude main() { printf(“OutPut from asm..\n$”); } 接下来我们看一看如何让C语言调用汇编例程。我们还是看一个简单的小程序: C语言部分如下: extern cursor (int,int), main() { cursor(15,12); } 汇编语言部分如下: .MODEL SMALL .CODE PUBLIC _CURSOR PROC PUSH BP MOV BP,SP MOV DH,[BP+4] MOV DL,[BP+6] MOV AH,02 MOV BH,00 INT 10H POP BP RET _CURSOR ENDP 通过上面这个程序,你会看到调用汇编语言的关键就是如何传递参数。事实上,是通过堆栈来传递的但是具体规则是什么呢,下面我就来看看。 二、调用规则 实际上,在C语言中使用汇编语言最困难的就是如何安全有效的传递参数。否则在调用汇编子程序时就会从堆栈中取出错误的参数。更可恶的是这种错误在编译的时候是不会发现错误提示的。 下面是C与MASM汇编语言混合是用的时候采用的规则: 1、 参数传递的次序与它们出现的次序是相反的。例如上例中的cursor (x,y)中,首先传递的是y,然后才是x。这与我们的一般想法是不一样的,所以在这儿容 易出现错误。 2、 传递完参数后,C程序还将保存(CS,IP)。如果C程序是SMALL或COMPACT存储模式下编译的(或者过程是NEAR型的),那么只保存IP,而 在MEDIUM、LARGE或HUGE模式下编译的(或者过程是FAR型的),那么CS和IP都会被压入堆栈,其顺序是CS在前,IP在后。不过这个过程 是C语言自动进行的而不需要我们干预。这也就是我们在例子2中为什么用MOV DH,[BP+4]而不是MOV DH,[BP]。因为前面是CS和IP而不是参数,真正的参数从[BP+4]开始。 3、 还有BP也必须保存在堆栈中,然后我们才可以通过BP和偏移地址来访问参数。 4、 最后一条指令应当是后面不带数字的RET,因为把堆栈到原始位置的工作将由C程序重新获得控制权以后才会执行。 5、 任何于C程序共享的名称都必须在前面加下划线,而且C语言只识别前8个字符。 6、 对于普通的参数C语言传递的是参数值,而对于数组,传递的是指针(也就是数据的地址)。 7、 如果C程序是在MEDIUM、LARGE或HUGE模式下编译的,那么汇编语言过程应该设为FAR型,C程序是SMALL或COMPACT存储模式下编译的,那么汇编语言过程应该设为NEAR型。 不过在MASM5.1或TASM1.0以及更高的版本的时候就不必担心偏移地址、在共享名称前加下划线以及保存BP这些琐事了,因为它们可以由编译器自动完成了。很显然例子2是旧格式的。 三、把参数返回C程序 当C程序需要从汇编过程获得某个参数时,这个参数应该通过寄存器来传递。具体使用哪些寄存器取决于参数的大小,请看下表: 寄存器 大小(字节) C数据类型 AL 1 Char,short AX 2 Int DX:AX 4 Long 四、把汇编语言程序与C语言程序链接到一起 1、 确保汇编语言中的过程被定义为PUBLIC,过程名以下划线开始。例如,在C语言中叫做“sum”到汇编语言中就应该是“_sum”. 2、 在C语言程序中过程定义为外部类型,例如在例子2中的extern cursor (int,int)。 3、 用汇编器对汇编语言程序汇编,得到XXX.obj文件。 4、 用C语言编译器编译C语言程序,得到YYY.obj文件。 5、 用链接器将它们链接到一起生成可执行文件: link XXX.obj + YYY.obj 以上就是混合使用C语言和汇编语言应该注意的几点问题。关于在GCC中使用汇编语言大体上是和上面一样的,只是实现细节上有一点区别而已。下面的这篇文章对于在GCC中使用内嵌汇编进行详细的解释。 GCC使用的内嵌汇编语法格式小教程 本文对内嵌汇编语法,从基本语法、内嵌汇编的格式介绍、和扩展的内嵌汇编格式进行了详细说明,需要说明的是GCC采用的是AT&T的汇编格式( 一、 基本语法 语法上主要有以下几个不同. ? 寄存器命名原则 AT&T: ,eax Intel: eax ?源/目的操作数顺序 AT&T: movl ,eax,,ebx Intel: mov ebx,eax ?常数/立即数的格式 AT&T: movl $_value,,ebx Intel: mov eax,_value 把_value的地址放入eax寄存器 AT&T: movl $0xd00d,,ebx Intel: mov ebx,0xd00d ? 操作数长度标识 AT&T: movw ,ax,,bx Intel: mov bx,ax ?寻址方式 AT&T: immed32(basepointer,indexpointer,indexscale) Intel: [basepointer indexpointer*indexscale imm32] Linux工作于保护模式下,用的是32位线性地址,所以在计算地址时不用考虑 segment:offset的问题(上式中的地址应为: imm32 basepointer indexpointer*indexscale 下面是一些例子: ?直接寻址 AT&T: _booga ; _booga是一个全局的c变量注意加上$是表示地址引用,不加是表示值引用( 注:对于局部变量,可以通过堆栈指针引用( Intel: [_booga] ?寄存器间接寻址 AT&T: (,eax) Intel: [eax] ?变址寻址 AT&T: _variable(,eax) Intel: [eax _variable] AT&T: _array(,,eax,4) Intel: [eax*4 _array] AT&T: _array(,ebx,,eax,8) Intel: [ebx eax*8 _array] 二、 基本的内嵌汇编 基本的内嵌汇编很简单,一般是按照下面的格式 asm(statements); 例如:asm(nop); asm(cli); __asm__是完全一样的( asm 和
本文档为【C语言内嵌汇编】,请使用软件OFFICE或WPS软件打开。作品中的文字与图均可以修改和编辑, 图片更改请在作品中右键图片并更换,文字修改请直接点击文字进行修改,也可以新增和删除文档中的内容。
该文档来自用户分享,如有侵权行为请发邮件ishare@vip.sina.com联系网站客服,我们会及时删除。
[版权声明] 本站所有资料为用户分享产生,若发现您的权利被侵害,请联系客服邮件isharekefu@iask.cn,我们尽快处理。
本作品所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用。
网站提供的党政主题相关内容(国旗、国徽、党徽..)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。
下载需要: 免费 已有0 人下载
最新资料
资料动态
专题动态
is_737352
暂无简介~
格式:doc
大小:20KB
软件:Word
页数:0
分类:生活休闲
上传时间:2017-11-10
浏览量:23