汇编语言过程调用与C语言函数调用的异同
c语言调用汇编语言函数的方式

c语言调用汇编语言函数的方式以C语言调用汇编语言函数的方式在编程中,有时需要使用汇编语言来实现一些特定的功能。
但是,由于汇编语言复杂且难以维护,因此我们通常使用高级语言如C语言来编写主要的程序代码。
在这种情况下,我们需要一种方法来调用汇编语言函数,以便在程序中使用它们。
本文将介绍如何使用C 语言调用汇编语言函数。
1. 定义汇编函数我们需要编写一个汇编函数来执行我们需要的操作。
汇编函数可以使用任何汇编语言,但是必须遵循特定的调用约定。
在x86架构中,调用约定指定了函数参数的传递方式、寄存器的使用方式以及栈的使用方式。
以Windows操作系统为例,Windows API使用的是stdcall调用约定,即参数从右往左依次压入栈中,返回值放在EAX寄存器中。
因此,我们需要在编写汇编函数时遵循这个调用约定。
下面是一个使用汇编语言实现计算阶乘的例子:```global factorial ; 导出函数符号section .textfactorial:push ebp ; 保存调用函数的栈帧指针 mov ebp, esp ; 设置当前栈帧指针mov eax, [ebp+8] ; 获取函数参数cmp eax, 1 ; 判断参数是否为1jle .base_case ; 如果是,则返回1dec eax ; 否则,计算(n-1)!push eax ; 保存(n-1)的值call factorial ; 递归调用阶乘函数pop ecx ; 恢复(n-1)的值imul eax, ecx ; 计算n*(n-1)!jmp .done ; 返回结果.base_case:mov eax, 1 ; 如果参数为1,则返回1.done:mov esp, ebp ; 恢复栈指针pop ebp ; 恢复调用函数的栈帧指针 ret ; 返回函数结果```在这个例子中,我们定义了一个名为“factorial”的函数,该函数计算输入参数的阶乘。
单片机编程语言比较C语言vs汇编语言

单片机编程语言比较C语言vs汇编语言单片机编程语言比较:C语言 vs 汇编语言单片机是一种嵌入式系统的核心组成部分,它们通过编程语言来控制硬件设备的操作。
在单片机编程中,C语言和汇编语言是两种常用的编程语言。
本文将比较C语言和汇编语言在单片机编程中的优势和劣势。
一、C语言C语言是一种高级编程语言,它的语法结构更接近自然语言,容易理解和学习。
以下是C语言在单片机编程中的一些优势:1. 可移植性:C语言的代码可以在不同的单片机上进行移植,只需要对底层操作进行少量的修改。
这大大简化了程序的开发和维护工作。
2. 抽象性:C语言提供了丰富的库函数和高级结构,可以简化底层操作的复杂性。
通过使用函数和模块化编程思想,可以更快速地开发出稳定的单片机应用程序。
3. 易于阅读和维护:C语言的语法规则相对简单,代码的可读性强。
在程序规模庞大或者需要频繁修改的情况下,C语言的易读性可以提高代码的可维护性。
然而,C语言也存在一些劣势:1. 速度较慢:相对于汇编语言而言,C语言程序的执行速度较慢,因为C语言的代码通常需要编译成机器码才能执行。
2. 存储占用较多:C语言中的库函数和高级结构对内存的消耗较大,这可能对内存资源较为紧缺的单片机造成影响。
二、汇编语言汇编语言是一种低级编程语言,它直接操作硬件寄存器和指令,具有更高的执行效率。
以下是汇编语言在单片机编程中的一些优势:1. 执行速度快:汇编语言直接操作底层硬件,没有C语言的编译和解释过程,所以执行速度更快。
在对执行效率要求较高的应用中,使用汇编语言可以更好地控制时间和资源。
2. 存储占用较少:使用汇编语言可以减少对内存的消耗,因为它没有C语言中的库函数和高级结构。
然而,汇编语言也存在一些劣势:1. 学习曲线陡峭:汇编语言的语法和操作方式与底层硬件紧密相关,需要较长的学习时间和经验积累才能熟练掌握。
2. 不易维护:汇编语言的可读性较差,代码的维护和理解难度较大。
汇编语言中常常需要直接处理内存和寄存器,这要求程序员对硬件结构有深入的理解。
单片机编程:C语言和汇编语言的比较

单片机编程:C语言和汇编语言的比较随着计算机技术的不断发展,单片机的应用范围也越来越广泛。
而在单片机的编程语言中,C语言和汇编语言是两种最为常见的语言。
那么,C语言和汇编语言之间究竟有何异同呢?本文将对这两种语言进行比较分析。
一、C语言和汇编语言的定义C语言是一种高级语言,属于结构化语言。
它是由美国贝尔实验室的Dennis Ritchie在20世纪70年代初期发明的。
C语言具有跨平台、代码可重用、易于调试等优点,它是目前使用最广泛的编程语言之一。
汇编语言是一种低级语言,它和机器语言是一一对应的。
每个汇编指令只对应着一个机器指令,但比机器语言更容易理解和编写。
汇编语言是一种面向位移和寄存器的语言,编写效率相比C语言较低,但它的优点是更接近硬件操作、更灵活、更节省资源。
二、C语言和汇编语言的编写方式C语言的编写方式是用高级语言编写程序,通过编译器将C语言代码转换为机器指令,然后将机器指令写入芯片内存,最终让芯片完成相应的工作。
C语言的高级语法让它的程序编写更为简单和直观,且代码可读性高,因此C语言是目前单片机应用当中的主流编程语言。
汇编语言的编写方式更为直接,是直接使用汇编指令将程序写入机器内存中。
通过汇编程序员可以掌控机器的每一个细节,实现更精准操作。
但是,由于汇编语言太过底层,编写效率相对C语言较低,难度也较大。
三、C语言和汇编语言的编程风格C语言强调程序结构的合理性,把程序分解为若干个模块并对各个模块进行定义,再按照一定的顺序组合起来构成一个完整的程序。
C语言的结构化编程使得代码理解和修改更为容易,同时也方便了程序的调试。
汇编语言的编程风格较为直接,它更接近于机器语言。
汇编程序往往需要手动跟踪硬件的寄存器和地址信息,所以代码的风格比较底层。
但是他可以针对不同的硬件环境和需求编写出更精简、更快速的代码。
四、C语言和汇编语言的应用场景C语言相对简洁优雅,适用于大型项目、复杂项目,开发时间短。
C语言在嵌入式应用中普遍应用,可以用于编写RTOS,GUI等应用。
C语言和汇编语言参数的传递

C语言和汇编语言参数的传递在C语言中,函数参数的传递有两种方式:值传递和引用传递。
在值传递中,函数将参数的实际值复制到形式参数中,这意味着在函数内对参数的任何更改都不会影响到原始变量。
而在引用传递中,函数通过传递变量的地址来传递参数,这允许函数直接操作原始变量,因此在函数内对参数的任何更改都会影响到原始变量。
C语言中,参数的传递方式是根据函数声明时参数类型的决定的。
例如,如果参数是基本数据类型(如整数或浮点数),则使用值传递;如果参数是指针类型,则使用引用传递。
尽管在C语言中,通过指针传递可以实现引用传递的效果,但是它并不是真正的引用传递。
在汇编语言中,参数的传递方式主要依赖于具体的指令集架构。
通常,汇编语言中只有值传递,因为汇编语言中没有高级语言中的变量和函数的概念,只有寄存器和内存地址。
在汇编语言中,将参数的值加载到寄存器中,然后通过寄存器传递给函数或子程序。
这些值可以是常数、寄存器或者内存地址。
在x86指令集架构中,参数可以通过寄存器传递,如EAX、EBX、ECX、EDX等,也可以通过栈传递。
在函数调用之前,参数的值通常会被存储在特定的寄存器中,然后通过指令将这些值传递给函数。
对于超过寄存器数量的参数,剩余的参数会被依次存储在栈上,由函数内部通过栈指针来访问。
与C语言相比,汇编语言中参数的传递要更为低级和复杂。
由于汇编语言中直接操作寄存器和内存,因此需要手动将参数的值加载到寄存器或内存中,然后将寄存器或内存中的值传递给函数或子程序。
另外,由于没有类型检查,程序员需要确保传递给函数或子程序的参数类型和数量是正确的。
总的来说,C语言和汇编语言在参数的传递方面存在一些不同之处。
C语言提供了更高级的抽象,允许使用引用传递,而汇编语言更为低级,只能通过寄存器或栈传递参数。
因此,在编写程序时,需要根据具体的需求和语言特性来选择合适的参数传递方式。
单片机编程C语言和汇编语言的比较

单片机编程C语言和汇编语言的比较单片机编程对于电子工程领域的从业者而言,是一项十分重要的技能。
而在单片机编程中,C语言和汇编语言是两种常用的编程语言。
本文将对C语言和汇编语言进行比较,分析它们在单片机编程中的优点和缺点。
1. C语言C语言是一种高级编程语言,与单片机硬件之间存在着一定的抽象层。
在单片机编程中,使用C语言相对于汇编语言具有以下优点:1.1 代码可移植性强:C语言是一种面向过程的编程语言,在不同的单片机平台上都可以使用。
这意味着使用C语言编写的代码可以轻松移植到不同的单片机上,提高了开发的效率。
1.2 开发效率高:相对于汇编语言而言,C语言编写代码的速度更快。
C语言的语法结构和函数库使得开发者能够更加轻松地实现复杂的功能,减少了编写代码的工作量。
1.3 可读性好:C语言的语法结构相对较简单,与自然语言更接近,使得代码更易读。
这对于后续维护和调试工作来说非常重要。
尽管C语言在单片机编程中有很多优点,但也存在一些缺点:1.4 性能稍逊:由于C语言的抽象层次较高,编译后的代码相对于汇编语言生成的机器码而言,执行效率可能稍低。
这对于一些对性能要求较高的应用来说可能是一个问题。
1.5 对硬件资源的控制不够细致:C语言的抽象层次使得对硬件资源的控制相对不够细致。
在一些对硬件资源要求严格的应用场景下,可能需要使用汇编语言来实现更精细的控制。
2. 汇编语言汇编语言是一种低级别的编程语言,直接操作硬件资源。
与C语言相比,汇编语言的优点如下:2.1 执行效率高:汇编语言直接操作硬件资源,在性能上具有明显优势。
由于对硬件更直接的控制,汇编语言生成的机器码执行效率通常较高。
2.2 控制精细:汇编语言可以对硬件资源进行更精细的控制。
这对于一些对硬件资源要求非常严格的应用场景非常重要。
然而,汇编语言也有一些不足之处:2.3 开发效率低:相对于C语言而言,汇编语言的开发效率低。
由于操作层级较低,编写、调试和维护汇编代码的工作量较大。
C学习笔记一C语言和汇编语言的区别

C学习笔记一C语言和汇编语言的区别C语言和汇编语言是计算机编程中常见的两种语言,它们在编写程序时有着不同的特点和用途。
本文将从语法、可读性、抽象程度以及机器依赖性等方面对C语言和汇编语言进行比较,以帮助读者更好地理解它们之间的区别。
1. 语法差异C语言是一种高级编程语言,它采用类似英语的结构化语法,具有丰富的语法特性,包括变量、数组、条件语句、循环语句和函数等。
C语言的语法相对简洁,能够快速实现一些功能。
而汇编语言是一种低级编程语言,使用各种助记符和符号来表示机器指令、寄存器和内存访问等,需要编写者有较强的硬件知识和技巧。
相比C语言,汇编语言更接近计算机底层,更加底层、精简和直接。
2. 可读性和可维护性C语言的语法结构和语义更加接近自然语言,代码具有较好的可读性和可维护性。
由于C语言的抽象程度较高,程序员可以更快速地理解代码,并进行修改和维护。
同时,C语言具有模块化的特点,程序可以按模块进行组织,便于团队协作开发。
相比之下,汇编语言的语法和符号较为晦涩,阅读和理解汇编代码需要具备较深的计算机体系结构和指令集的知识。
汇编语言编写的程序通常较为底层,代码行数相对较多,可读性和可维护性较差,需要更高的技术水平和耐心。
3. 抽象程度C语言是一种高级语言,提供了丰富的语法特性和抽象层次,为程序员提供了更方便和高效的编程方式。
C语言可以在不同的计算机平台上进行移植,并且可以通过调用库函数实现复杂的操作,具备良好的抽象能力。
汇编语言是一种低级语言,提供了直接操作硬件的能力。
汇编程序员可以直接访问寄存器、内存等底层资源,实现对计算机的精细控制。
汇编语言相对于C语言来说更接近机器语言,具有更高的执行效率和更大的灵活性。
4. 机器依赖性C语言是一种面向过程的编程语言,编写的程序相对独立于具体的硬件平台,具有较好的可移植性。
通过编译器的编译,C语言可以在不同的操作系统和计算机上运行。
汇编语言则直接操作底层的机器指令和寄存器,与具体的硬件平台密切相关,不同的计算机架构和操作系统可能需要不同的汇编代码。
c语言和汇编的对应关系

c语言和汇编的对应关系在计算机编程领域中,C语言和汇编语言一直都是重要的编程语言。
虽然它们在语法和表达方式上有很大的区别,但是它们之间存在一种对应关系,这种对应关系在计算机科学教育和软件开发中起着重要作用。
C语言是一种高级编程语言,具有结构化的特点。
它是由Dennis Ritchie在20世纪70年代早期开发的,被广泛应用于操作系统、嵌入式系统以及应用程序开发等领域。
C语言相对于汇编语言来说,更加抽象和易于理解,具备良好的可读性和可维护性。
汇编语言则是一种低级编程语言,直接基于机器语言。
它使用符号和助记符来代替二进制指令,用于直接控制计算机硬件。
与C语言相比,汇编语言更加接近计算机硬件的实际运行方式,对硬件资源的调用和管理更为灵活。
虽然C语言和汇编语言有很大的差异,但是它们之间存在着一种对应关系,这种对应关系体现在以下几个方面:1. 语法结构的映射:C语言和汇编语言的基本语句结构有着一定的对应关系。
比如,C语言中的循环结构可以对应为汇编语言中的跳转指令和标签。
在C语言中,我们可以使用for、while循环等语句来实现循环,而在汇编语言中,我们可以使用jmp指令和标签来实现类似的功能。
2. 数据类型的映射:C语言中的数据类型和汇编语言中的数据寄存器有一定的对应关系。
C语言中的整型、浮点型等数据类型可以在汇编语言中用相应的寄存器来存储和操作。
通过对C语言变量的声明和定义,我们可以确定相应的汇编语言寄存器的用法。
3. 函数的调用:C语言中的函数调用和汇编语言中的子程序调用也有一定的对应关系。
在C语言中,我们可以使用函数调用来实现代码的模块化和重用。
而在汇编语言中,我们可以使用call指令和ret指令来实现类似的功能。
4. 编译和汇编过程:C语言可以通过编译器将源代码转换为可执行文件,而汇编语言可以通过汇编器将汇编代码转换为机器指令。
在这个转换过程中,编译器和汇编器会根据语法规则和对应关系来进行相应的转换和优化。
c语言和汇编语言的关系

c语言和汇编语言的关系随着计算机技术的不断发展,编程语言也在不断更新迭代。
C语言作为一种高级语言,其强大的功能和简洁的语法赢得了广泛的用户群体。
而汇编语言则是一种低级语言,它与硬件紧密相关,可以直接操作计算机的各种硬件设备。
虽然C语言和汇编语言在语言结构和语法上有很大的差异,但是它们之间有着紧密的联系和互动。
首先,C语言和汇编语言都是计算机语言的一种。
C语言是一种高级语言,具有可移植性和代码可读性的特点。
C语言的语法结构简洁明了,易于学习和使用,是很多程序员的首选语言。
而汇编语言则是一种低级语言,它直接操作计算机的硬件,可以对计算机的各种硬件设备进行直接控制,因此具有很高的效率和灵活性。
C语言和汇编语言之间的联系主要体现在以下几个方面:1. C语言可以调用汇编语言编写的函数。
在C语言中,可以使用汇编语言编写的函数来实现一些特殊的功能。
例如,在C语言中,可以使用汇编语言编写的函数来实现对硬件设备的直接控制,从而提高程序的运行效率。
2. C语言可以嵌入汇编语言代码。
在C语言程序中,可以嵌入一些汇编语言代码,用来实现一些特殊的功能。
例如,在C语言中,可以使用汇编语言代码来实现对特定寄存器的操作,从而提高程序的效率。
3. C语言可以生成汇编语言代码。
在C语言编译器中,可以将C 语言代码编译成汇编语言代码。
这样,程序员可以通过查看汇编语言代码来深入了解程序的运行过程,从而更好地优化程序。
4. 汇编语言可以调用C语言编写的函数。
在汇编语言中,可以直接调用C语言编写的函数,从而实现更加复杂的功能。
例如,在汇编语言中,可以调用C语言编写的函数来实现对字符串的操作。
5. 汇编语言可以直接操作C语言中的变量。
在汇编语言中,可以直接访问C语言程序中的变量,从而实现更加灵活的操作。
例如,在汇编语言中,可以直接操作C语言程序中的数组,从而实现更高效的数据处理。
总的来说,C语言和汇编语言之间的联系非常紧密,它们可以相互调用、嵌入、生成和操作,从而实现更加高效、灵活和复杂的功能。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
汇编语言过程调用与C语言函数调用的异同学号:姓名:内容摘要:本文主要对基于Intel 80X86CPU 系列的32位高级汇编语言过程调用与基于C99标准的C语言函数调用进行比较。
在程序设计中,有类程序不能独立运行它们需要被另一个程序调用后才能运行,汇编语言称这类程序为过程,对该类程序调用即称为过程调用。
与之相对应在高级语言C语言中对程序进行模块化设计而形成用函数完成特定的功能的程序设计。
汇编过程调用以堆栈结构为核心包括定义、调用机制应用、变量访问等关键行为。
在C语言中则包括定义、参数定义、数据传递等。
关键词:函数、过程、数据传递、堆栈一、过程定义与函数定义的异同相同点:1.都遵循先定义后使用的规则,并且要指定过程的名字和函数的名字以便以后按名调用。
2.一般来说汇编语言的过程调用和C函数调用(该函数不是Void类型)在过程和函数中至少有一个返回指令。
3.过程名和函数名的取名都按标识符取名规则取名。
4.都可定义有参过程或函数,过程或函数体包括声明部分和语句部分。
5.汇编语言可以定义空过程,C函数可以定义空函数。
不同点:1.(1)汇编过程定义过程名PROC [NEAR/FAR]…………………………………………………………..过程名ENDP(2)C函数定义类型名函数名(形式参数列表){函数体}2.过程定义是要用到@noframe,该单词让程序员在过程里建立用普通指令访问堆栈的指针EBP,为自动局部变量分配堆栈空间、过程结束时撤销用普通指令访问堆栈的指针、回收自动变量和形参占用的堆栈空间,用正确的RET指令返回调用程序。
而函数调用不会用到该单词1。
3.形参定义格式不同:汇编语言过程中形参的定义过程名(形参表)[var]形参名:类型标识符C语言函数类型名函数名(类型:变量名,…….)二、过程调用与函数调用的形式的异同相同点:1.最终都是通过调用栈来实现过程和函数的调用。
2.两者都可以进行嵌套调用和递归调用。
不同点:1.格式不同:汇编调用过程指令格式Call 过程名C函数调用语句把函数调用单独作为一个语句。
例如:printf_star();2.在调用有参数过程时,调用程序在call 指令之前必须将实参值或实参的地址压入堆栈。
.调用赵建州《32位汇编语言程序设计》第227页、广西师范大学计算机科学与信息工程学院2008.12三、过程调用与函数调用的数据传递的异同相同点:1.都包括值传递和引用传递的形式2.形参都可以从实参得到一个值。
3.主函数可以调用其他的函数,但其他的函数不能调用主函数。
在主函数前用函数不需要申明,在主函数后用需要申明。
不同点:1.汇编过程调用时可以直接利用CPU的通用寄存器资源,在过程调用前的机器状态和过程返回后的机器状态一致,所以要保护寄存器。
2.汇编过程执行时要先把原来的基地址寄存器ebp值入栈,因为在程序执行中ebp要另作他用,可以由此寻址获得函数参数。
3. C语言函数调用与之相比具有一下区别:C语言中函数访问参数的方法就是先通过"PUSH BP"保存BP,"MOV BP,SP"把当前的堆栈指针传递给BP.第一个参数的地址就在BP+4,第二个参数的地址就在BP+6,...比如"MOV AX,WORD PTR[BP+4]"就可以把第一个参数值传给AX 寄存器.而需要留意的是C传递参数的顺序是和其它语言相反的.C语言是把参数的地址从右到左压入堆栈,所以越后面的参数,在堆栈中的地址越靠前.2四、过程调用与函数调用的步骤的异同1、在定义过程和函数中指定的形参在未出现调用时它们并不占用存储单元,在发生调用时它们的形参被临时分配存储单元。
在汇编语言中调用一个过程发生在寄存器中,主过程需要和子过程建立传递结构。
调用程序首先把实参值或实参的地址压入堆栈,执行CALL指令把返回地址压入堆栈。
调用程序构建2曹加恒等《新一代汇编语言程序设计》第170页、高等教育出版社北京2003年2月传递结构的使命结束,接着将ESP的值复制给EBP,从此EBP代表传递结构的基址然后为局部变量分配内存空间,最后保护机器状态。
此后还需要清除传递结构。
在C语言中则主要是在内存中进行值传递和地址传递然后进行相关运算。
2、在C语言中通过return语句将函数值带回主函数,在汇编中则通过执行RET指令在栈顶确定返回的地址。
3、调用结束后,C语言中形参单元被释放。
在汇编过程中一般来说,退出一个程序有两种办法,一是利用中断,二是利用ret 语句返回。
用ret 语句要先进行堆栈初始化方可。
五、过程调用与函数调用返回值的异同相同点:汇编语言中的ret指令和C语言中的return();语句的功能都是使子程序在功能完成之后返回调用程序继续执行。
不同点:在汇编语言中需要call和ret的配合使用,返回指令根据是段内返回还是段间返回把返回地址弹出栈送IP,或者弹出栈送IP与CS,并且如果RET带有操作数,将对栈指针SP进行相应的修改。
. 当在C语言中当函数体返回某一值遇到return语句时,CPU将之前压入堆栈的PC指针寄存器和状态寄存器的值弹出,并写回到相应的寄存器中地方六、过程调用与函数调用中访问局部变量和全局变量的异同相同点:两者的作用域的使用范围是相同的。
不同点:1、在C语言中声明局部变量和全局变量在栈区由编译器自动分配释放存放他们的值,在堆区由程序员分配释放程序结束时由OS收回类似链表。
2、在汇编语言中局部变量的起始值是随机的,局部变量的值一定要初始化并占用内存空间。
3.汇编语言在过程里访问局部变量只能以EBP为基址,用变址寻址方式访问局部自动变量,局部自动变量是无名变量例6:以EBP为基址访问过程局部自动变量procedure exam; @noframe;begin exam;push( ebp ); // 保护寄存器EBPmov( esp, ebp ); // 建立基址指针EBPsub( 8, esp ); // 为局部变量分配内存空间push( eax ); // 保护寄存器mov( 6, (type dword [ebp-4]) ); // 访问局部变量amov( [ebp-4], eax );mov( eax, [ebp-8] ); // 访问局部自动变量b …end exam;3七、实例用选择法实现对10个数的排序1、用C语言编写代码如下#include<stdio.h>int main(){void sort(int a[],int n); //定义形参变量int a[10],i;printf("enter 10 numbers:\n");for(i=0;i<10;i++)scanf("%d",&a[i]);sort(a,10); //调用sort函数printf("the sorted array:\n");for(i=0;i<10;i++)printf("%d",a[i]);printf("\n");return 0;}void sort(int a[],int n) //sort函数实现{int i,j,k,t;for(i=0;i<n-1;i++){k=i;for(j=i+1;i<n;j++)if(a[j]<a[k])k=j;t=a[k];a[k]=a[i];a[i]=t;}}2、用汇编语言编写代码如下program HelloWorld;赵建州《32位汇编语言程序设计》广西:广西师范大学出版社2008 PPT#include("stdlib.hhf")constN:uns32:=16; //定义变量staticdata:uns32[N]:=[1,2,16,14,3,9,4,10,5,7,15,12,8,6,11,13];//定义数组begin sort; //定义过程push(ebp); //保护寄存器以ebp为基址访问过程全局自动变量mov(esp,ebp);push(eax);push(ebx);push(ecx);push(esi);push(edi);mov(n,ecx);dec(ecx);mov(data,ebx); //引用形参是指针mov(0,esi); //前元素下标L1: mov(esi,edi);mov([ebx+esi*4],eax);inc(edi);L2: cmp(eax,[ebx+edi*4]);jle L3;xchg(eax,[ebx+edi*4]);L3: inc(edi);cmp(edi,n);jb L2;cmp(eax,[ebx+esi*4]);je L4;mov(eax,[ebx+esi*4]);L4: inc(esi);cmp(esi,ecx);jb L1;pop(edi);pop(esi);pop(ecx);pop(ebx);pop(eax);mov(ebp,esp);pop(ebp);ret(8); //过程返回end sort; //过程调用结束begin HelloWord;stdout.put("数组选择排序",nl,nl);mov(0,ecx);mov(0,eax);La: stdout.put(data[eax*4]:5);inc(ecx);cmp(ecx,4);jne Lb;stdout.put(nl);mov(0,ecx);Lb: inc(eax);cmp(eax,N);jb La;stdout.put(nl,nl);push(&data);pushd(N);call sort; //调用过程mov(0,ecx);mov(0,eax);Lc: stdout.put(data[eax*4]:5);inc(ecx);cmp(ecx,4);jne Ld;mov(0,ecx);Ld: inc(eax);cmp(eax,N);jb Lc;stdout.put(nl,nl);stdout.put("击回车键结束:");stdin.readLn();end HelloWorld;4以上两个程序代码的设计涉及到过程定义、堆栈传值、参数引用、局部以及全局变量定义和C语言函数的定义、调用等知识。
4赵建州《32位汇编语言程序设计题解与上机指导》第159页、广西师范大学计算机科学与信息工程学院2008.12参考文献[1]谭浩强《C程序设计(第四版)》[M].北京:清华大学出版社,2008[2]付德胜、孙文静《高级汇编语言程序设计级应用》南京:东南大学出版社2009.8[3]廖建明《汇编语言程序设计》北京:清华大学出版社2009.10[4]曹加恒等《新一代汇编语言程序设计》北京:高等教育出版社2003.2[5]赵建州《32位汇编语言程序设计》广西:广西师范大学出版社2008(带PPT)。