1、语言和汇编语言的混合编程有三种形式:在编写语言代码中插入汇编语句只需在汇编语句两边加上双引号和括号,在括号前面加上标识,如“汇编语句”;在编写代码的过程中调用内联函数中有一些直接映射为内联的指令的特殊函数,内联函数用前下划线表示,使用时同调用语言的库函数一样调用它,如;汇编代码以代码可以调用的函数出现。本文采用第三种形式。为了使程序代码的执行具有尽可能高的执行效率,本文将着重点放在并行汇编代码的编程,而不是线性汇编代码的编程。 语言与汇编语言混合编程的接口规范和标准用语言编写的代码中核心代码常常只是整个程序代码的,但是却占用了整个程序约的执行时间。对这些核心代码采用汇编语言编写,可以大大提高代
2、码的执行效率,而语言程序可以象调用程序的一个函数那样去调用这个汇编函数。为了实现语言和汇编语言的混合编程,需要注意一些规定的接口规范和标准。()采用语言和汇编语言混合编程时,定义了一套严格的寄存器规则。这个寄存器规则表明了编译器如何使用这些寄存器以及在函数调用过程中如何保护这些寄存器。调用函数保护了寄存器和,这就使得在编写汇编程序的时候可以任意的使用这几个寄存器而不需保护它们。但当使用到寄存器或的时候,则必须自行对它们进行保护。长型、双精度型或者是长双精度型的数据对象要放在一个奇偶寄存器对(如:)里,奇数寄存器存放着数据的符号位、指数位和最高有效位,而偶数寄存器则存放着低有效位。在默认情况下,
3、用作返回结构指针寄存器,用作被调用函数返回地址寄存器,用作帧指针寄存器,用作数据页指针寄存器,用作堆栈指针寄存器。这些寄存器在被调用的汇编函数中用到时都要进行保护。()调用函数将参数传递到被调用函数中,前十个参数将被从左到右依次放入寄存器、和,如果传递的参数是长型、双精度型或者是长双精度型,则将参数依次放入寄存器组:、:、:等,并将剩下的变量按相反的顺序放在堆栈里。注意,如果传递的参数是一个结构类型的参数,则传递的是该结构类型的地址。()如果在调用函数中做了正确的函数返回声明,则被调用的汇编函数可以返回有效值。如果返回值是整型或位的浮点型,则放在寄存器中返回;如果返回值是双精度或是长双精度型,
4、则放在:中返回;如果返回值是一个结构类型,则将其结构的地址放在中返回。()编译器为所有的外部对象指定一个链接时的名字。当写汇编语言代码时,必须用与这个名字相同的名字。对于只在汇编语言模块中用到的变量的标识符,不能从下划线开始。任何一个在汇编语言中声明的对象都要使其在中是可访问的,那么在汇编语言中必须用 或将其声明为外部变量。同样在汇编语言中要引用函数或对象时,必须用 或将对象声明,这将产生一个在汇编语言函数中没有定义的由链接器辨识的外部引用。还有一些细节也需要注意,如中断子程序必须把该子程序将要用到的所有寄存器进行入栈处理;除了全局变量的初始化外,汇编语言的模块不得因为任何目的而使用段;汇编代
5、码的结束需用指令 将程序执行从被调用函数返回到语言调用函数中。 并行汇编代码的编写的汇编代码格式如下:标号: 并行标记 条件寄存器指令助记符 功能单元 操作数 ;注释。如: , , ;用到了交叉数据通道片内有个并行的处理单元,分为相同的两组。其体系结构采用超长指令字()结构,一个指令包里的条并行指令可同时分配到个处理单元并行运行。这种一个指令包里有条指令并行执行也给并行汇编代码的编写带来很多要考虑的问题具体如下:()指令的执行可以用延迟间隙来说明。延迟间隙在数量上等于从指令的源操作数被读取到执行的结果可以被访问所用的指令周期。如对于乘法指令(),源操作数从第个周期被读取,则其计算结果在第()个
6、周期才可用。()使用相同功能单元的两条指令不能被安排为并行指令。()使用同一条交叉通路的两条指令不能被安排在同一个执行指令包中,这是因为从寄存器组或者从都只有一条交叉通路。将数据读入到(或存储自)相同寄存器组的两条读(写)指令不能被安排在同一个执行包中。每一个执行包里只能允许每一寄存器组处理一个长定点类型数据。在一个指令周期内对同一寄存器读取多于四次是不允许的,但条件寄存器不在此限制之列。在一个指令周期内,不能同时存在两条写入同一寄存器的指令,只有在写操作不是在同一个指令周期发生时,才可以将具有同一目的地址的两条指令安排并行。 基于的运动补偿的混合编程设计实例运动补偿是标准中的一种重要算法。运
7、动补偿是指根据运动矢量在参考帧中找出参考块。如果运动矢量的分量和分量都是整象素长度,则直接在参考帧中找出参考块。如果为半象素长度,则需要通过内插运算计算出参考块,计算出的参考块需要加上解码得出的误差块才能得到当前参考块。本文给出了运动矢量的分量和分量都是整象素长度时的运动补偿方法。根据运动矢量可直接在参考帧中找到参考块()。完成此功能的语言函数如下: 参数运动矢量对(个字节为一个字,长位)的余数可能是、。当余数是的时候,编译后执行代码是按字读取()的,这充分体现了的优点,也使程序的运行效率比较高。而当余数不为的时候,则可能是按字节读取()或是按半字读取(),这使程序的运行效率较低。视频的编码和
8、解码都要用到运动补偿来重构图像,这是一个很费时的操作,而且其代码也是图像处理中的核心代码,这样就要求编写高效的程序来完成此操作。为了使代码的运行效率更高,且结合的硬件特点,希望对于不同的运动矢量,做运动补偿的时候都能采用按字读取和存储的方式。这需要对运动矢量参数除以,根据余数调整指针,使指针始终指向字对齐方式而在程序中当前块是型的以字节方式存储的,对其进行移位处理只能是一个字节一个字节地进行移位,这就使得在程序中不能用和汇编程序同样的方法来对程序进行优化,如运动矢量除以以后的余数为,为了使要取的个象素对准字访问方式,则要按图进行操作。 根据运动矢量参数进行移位使其对准字访问的核心代码的程序为: ;获得地址的位 ;参考块第一个元素的地址 ;字对准访问的地址 ;用两个位得;到了需右移几个字 ;需左移几个字 ;需右移的数 ;需左移的数作为一个说明语言与汇编程序混合编程的设计例子,采用并行汇编实现了这个函数的优化。这里只给出部分汇编程序: ;将该段汇编代码安排在段,当然通过在语言中用也可以将其安排在其它自己命名的段中。 ;函数名,用或对其进行声明,使得代码调用该函数 ;标号,是调用函数和汇编被调用函数的接口处 , , , ;被调用函数用到了, ,;的寄存器,则需对它们保护 , , , ;关闭某些中断 ,读取第一个字 , ;读取第二个字 , ;读取第三个字 , ,