汇编语言参数传递
- 格式:ppt
- 大小:204.50 KB
- 文档页数:26


c语言调用汇编语言函数的方式
以C语言调用汇编语言函数的方式
在编程中,有时需要使用汇编语言来实现一些特定的功能。但是,由于汇编语言复杂且难以维护,因此我们通常使用高级语言如C语言来编写主要的程序代码。在这种情况下,我们需要一种方法来调用汇编语言函数,以便在程序中使用它们。本文将介绍如何使用C语言调用汇编语言函数。
1. 定义汇编函数
我们需要编写一个汇编函数来执行我们需要的操作。汇编函数可以使用任何汇编语言,但是必须遵循特定的调用约定。在x86架构中,调用约定指定了函数参数的传递方式、寄存器的使用方式以及栈的使用方式。
以Windows操作系统为例,Windows API使用的是stdcall调用约定,即参数从右往左依次压入栈中,返回值放在EAX寄存器中。因此,我们需要在编写汇编函数时遵循这个调用约定。
下面是一个使用汇编语言实现计算阶乘的例子:
```
global factorial ; 导出函数符号
section .text
factorial:
push ebp ; 保存调用函数的栈帧指针
mov ebp, esp ; 设置当前栈帧指针
mov eax, [ebp+8] ; 获取函数参数
cmp eax, 1 ; 判断参数是否为1
jle .base_case ; 如果是,则返回1
dec eax ; 否则,计算(n-1)!
push eax ; 保存(n-1)的值
call factorial ; 递归调用阶乘函数
pop ecx ; 恢复(n-1)的值
imul eax, ecx ; 计算n*(n-1)!
龙源期刊网
C和汇编之间参数传递机制剖析
作者:庞新法
来源:《价值工程》2014年第29期
摘要: 本文剖析了混合编程转返机制和参数传递的基本方法。
Abstract: This paper illustrates the mixed programming turn back mechanism and basic
methods of parameter transferring.
关键词: C 语言;汇编语言;参数传递
Key words: C language;assembly language;parameter transferring
中图分类号:TP312 文献标识码:A 文章编号:1006-4311(2014)29-0225-02
1 绪论
C语言与汇编语言混合编程,可以发挥各自优势,提高程序的开发效率。这必然涉及到二者相互调用时的接口:C程序与汇编程序如何转返、二者之间如何互传数据。
2 名字声明约定
2.1 汇编、C模块对自己未定义的但要引用的别的模块的名字(该名字允许被引用)要声明。C模块声明格式:函数声明格式:extern类型函数名(形参表);变声明格式: Extern类型变量;汇编模块声明格式:函数声明格式:extern函数名:属性(near,far)。变声明格式:Extern变量名:属性(byte,word,dword等)。
2.2 自己定义的不仅自己可用,且可供别的模块引用的名字也必须声明。汇编模块声明格式:PUBLIC名字。C模块声明格式:全局变量,函数名前不加static即可。
3 转返机制
为了说明C主程序如何转到汇编子程序,汇编子程序执行结束如何返回C主程序,把例1
2010年03月
第l6卷第2期 内蒙古民族大学学报
Journal of Inner Mongolia University for Nationalities Mar.2010
V0l_16 No.2
浅议JAVA语言中的参数传递
隋振友
(内蒙古民族大学成人教育学院,内蒙-b-通辽028000)
[摘要]在C程序设计语言中,关于使用参数进行传值或传地址,已经明确给出,但是我们在使用JAVA ̄序设
计语言进行程序设计时,一些书中却给出了一种笼统模糊的说法,“在Java里面参数传递都是按值传递”,本文 对JAVA中的笼统模糊的说法进行详尽的说明。
[关键词]参数传递;按值传递;按引用传递 [中图分类号]TP312 [文献标识码]A [文章编号]1008—5149(2010)02—0009—02
在C程序设计语言或c++程序设计语言中关于使用参数传值或传地址已经明确给出。但在JAVA程序设计语言中,却有
一些争论,似乎最后还有一个所谓的结论:“在Java= ̄面参数传递都是按值传递”。事实上,这让人产生了迷惑,我们通过下
面的例子面先分别看看什么是按值传递,什么是按引用传递,只要我们正确理解了它,至于称作按什么传递就不是个大问题
了。 1:按值传递是什么:指的是在方法调用时,传递的参数是按值的拷贝传递。按值传递重要特点:传递的是值的拷贝,传
递后就互不相关了。示例如下:
public class TempTest{ private void testl【int a)f
a=5: System.out.println(”testI方法中的a一”+a);
) public static void main(String[】args)( TempTes/t:new TempTest();
int a=3: t.testl(a);,/传递后,testl方法对变量值的改变不影响这里的a
System.out.println(”main方法中的a===”+a);
教材新探
r。+”+ +“+ +”+ +‘。+ +“+“+。+’’+ +‘’+“+’’+“+ + 浅谈汇编 语言 中子
■李哲
{ k +..+ +..+..+”+一+..+一+..+-+一+ +一+”+一+・・+一+一+・・ 汇编语言是一种符号语言,指令由助记符表示。 与机器语言相比,汇编语言具有指令容易记忆、理 解、识别和可读性好的优点,但实质上由于汇编语言 也是面向机器的语言,是机器语言程序的符号表示, 所以用户必须熟悉机器的硬件结构和指令系统,掌 握计算机的工作过程才能熟练编程。目前采用 8086/8088汇编语言系统组织教学仍是最佳选择。 子程序结构是一种解决重复性问题的重要设计 方法,采用子程序结构可以简化源程序书写、提高程 序存储效率、减少出错率、增加程序的易读性和可维 护性,并且有利于子程序资源的组织和使用。与一 般程序的编写方法相比,子程序具有以下几个特点: (1)子程序应命名。子程序入口即子程序的第 一条指令应加标号作为子程序名,以便主程序调用。 (2)子程序中应注意堆栈的使用,以保护和恢复 现场。在有些情况下,若子程序需要改变主程序中 某些寄存器或存储单元的结果,而这些结果又不能 被修改或在子程序调用之后仍然需要则应在子程序 中首先将这些内容使用进栈指令保护,在子程序返 回之前使用出栈指令恢复现场。 (3)子程序的结尾必须为子程序返回指令 RET,并保证堆栈栈顶为调用程序的返回地址。 (4)子程序嵌套时应考虑堆栈的深度。 (5)能够正确传送参数。参数分为入口与出口 参数。所谓入口参数,即调用子程序之前,需要传给 子程序的参数。所谓出口参数,即子程序返回时应 送回调用程序的结果参数。应根据具体情况选择不 同的参数传递方式,通常使用寄存器、存储器或堆栈 的方式传送参数。 (6)子程序应具有一定的功能和通用性。对于 操作数据应尽量使用以地址或寄存器形式给出,一 般不针对具体的数据编写子程序。 (7)为了便于调用,子程序应提供足够的信息。 如:子程序名、子程序功能、入El参数和出口参数、子 程序占用的硬件资源、子程序中调用的其他子程 序名。 设计子程序时,需要考虑以上七个特点,在这里 对现场保护、参数传递、子程序的嵌套进行进一步的 说明。 1.现场保护 现场保护的目的是调用子程序之后,能够返回 主程序继续执行。因此要对子程序中用到的寄存 器、堆栈进行必要的保护。 (1)寄存器保护。因为汇编语言程序中的主要 操作对象是CPU中的各寄存器,对那些主程序和 子程序中都会用到的一些寄存器要在子程序使用之 前进行保护。寄存器保护最好是在子程序中进行, 并且在子程序中进行恢复,这样子程序显得更完整。 其方法是使用堆栈,由于指令系统中制定了规范的 进栈指令PUSH和出栈指令POP,并会自动修改堆 栈指针,只要在程序设计中注意8086/8088的堆栈 是否按“后进先出”的原则组织的。 (2)堆栈保护。子程序是利用调用CALI 指令 和返回RET指令来实现正确的调用和返回的。因 为CAu 命令执行时压入堆栈的断点地址就是供 子程序返回主程序时的地址,编程时一定要注意子 程序的类型属性,即是段内调用还是段间调用。段 内调用和返回为NEAR属性,段问调用和返回为 FAR属性。8086/8088的汇编程序用子程序定义 PR()C的类型属性来确定CALL和RET指令的属 性。如果所定义的子程序是FAR属性,那么对它 的调用和返回一定都是FAR属性;如果所定义的子 程序是NEAR属性,那么对它的调用和返回也一定 是NEAR属性。这样用户只是在定义子程序时考 虑它的属性,而CALI 和RET指令的属性就可以 由汇编程序来确定了。另外,进入子程序后再使用 堆栈时也必须保证压人和弹出字节数一致,如果在 这里堆栈存取出错,必然会导致返回地址的错误。 2.参数传递 主程序在调用子程序时,经常要向子程序传递 一些参数或控制信息,子程序执行后,也常需要把运 行的结果返回调用程序。这种信息传递称为参数传 递,其常用的方法有寄存器传递、内存固定单元传 递、堆栈传递。 (1)寄存器传递。由主程序将要传递的参数装 入事先约定的寄存器中,转入子程序后再取出进行 处理,这种方法受CPU内部寄存器数量限制,因此 只适于传递少量参数的场合,如一些常见的软件延 时子程序,均是利用某寄存器传递循环计数器初值。 (2)通过内存固定单元的传递。此方法适于大 量传递参数时使用,它是在内存中开辟特定的一片 区域用于传递参数。主程序和子程序都按事先约定 在指定的存储单元中进行数据交换,这种方法要占 用一定数量的存储单元。不足之处是信息易被修 改,不利于模块化设计。 (3)通过堆栈实现参数传递。这种方法是先在 主程序中把参数和参数地址压人堆栈,在子程序中 取出使用,由于堆栈操作不占用寄存器,并且堆栈单 元使用后可自动释放,反复使用,便于实现数据隔离 和模块化设计。使用这种方法时,当子程序返回后, 这些参数就不再有用了,应当丢弃。这时可以利用 带立即数的返回指令修改指针,使其指向参数人栈 以前的值。 3.子程序嵌套 汇编语言中子程序的嵌套只要堆栈空间允许, 一般不受嵌套层次限制。嵌套子程序设计中,应注 意寄存器的保护和恢复,避免各层子程序之间寄存 器冲突。递归子程序的设计必须保证每次调用都不 破坏以前调用时所用的参数和中间结果。为保证每 次调用的正确,一般把每次调用的参数、有关寄存器 的内容以及中间结果进栈保存。 (作者单位:郑州广播电视学校)