汇编程序和c语言程序,汇编语言跟C语言之间不得不说的秘密!

C语言与汇编语言的元素的部分对应关系:

c语言 汇编语言

Byte/word/dword等数据类型 Int,float,char,long等数据类型

宏 宏

子程序 函数

六大操作指令 +,-,*,/,以及一些函数

堆栈 数组,申请的动态内存,链表

地址 指针

Int 21h中的1,2,3,4,9, Scanf,printf,get,getchar等输入输出函数

0ah等以及调用c语言函数

C语言函数的实现:

首先从反回编buffer中可以看出,函数在代码段中存储位置并不是与主程序相接,而是在函数与函数,主程序与函数之间存在一段空白的代码段,当主程序要调用函数时,首先EIP指向下一条代码,需要将函数的首地址传到主程序中,下面来看一看在主程序中调用oq的汇编代码

lea eax,[chr] push eax

call oq (0B710D7h)

即使用汇编语言中的函数调用程序CALL,将子函数的地址压入eip,从而让主程序执行到函数处,之后,开始执行函数中的代码。在子函数执行完成后,esp所指向的堆栈地址给EIP,执行函数下一步的指令。

子函数中的参数是通过堆栈操作来实现的。在调用函数时,首先参数被压栈,而且是以反向的顺序将参数压栈的。再将返回地址压栈,当子函数开始执行时,ebp被压入堆栈,再将esp的值赋给ebp,以后就将ebp作为寻址所有子函数的参数的基址使用,如给参数从0开始编号,则参数的访问公式为[ebp+8+i*4]参数有值参数和引用参数,通过引用参数可以在子函数中改变参数对应的值。局部变量是esp减去一个数值,在堆栈上为其保留空间实现的。若给局部变量从0开始编号,则局部变量的访问实质上是通过公式[ebp-(i+1)*4]实现的。在子函数返回时必须清理堆栈,否则会导致内存泄露或者堆栈破坏。

C与汇编的优缺点及适应场合

先说说汇编,可以说没有c语言是可以的,虽然可能会有很多不方便,但是没有了汇编语言计算机直接就无法运行,因为汇编语言是基于计算机底层硬件的编程,通过它实现了对cpu,内存,硬盘以及外界设备的直接操作,因为直接所以汇编语言在程序的大小,执行的速度与效率方面几乎无可比拟,但是也是因为直接,所以汇编程序难以移植,且完成相同的操作代码量太大,在进行一些大的项目是,单独使用汇编进行编程几乎不可能实现。

再说说c语言,与汇编语言相比,c语言在更加接近人的一般思维,因此我认为在程序的设计过程中比较容易操作,此外在进行一些复杂的操作,运算时,c语言比汇编就要简单很多,尤其是c语言中的丰富的函数库,可以直接实现一些原本很复杂的功能,并且从代码量来说任意一个c语言程序,通过反汇编之后变成汇编语言程序,其长度都可能要增加好几倍,因此反过来说完成相同的功能编写c语言程序的事件将会只是编写汇编语言程序的几分之一,从编写程序的效率上来说c语言无疑更高,此外C语言是高级程序语言因此可移植性较好,不太受到到硬件设备的限制。但是与汇编相比,在实现一个功能时,汇编语言可以直接奔着目标去,而C语言则是给你提供了一种对于对于这种问题的普遍处理办法,不具有针对性,因此会有许多多余的在这个问题中不需要的过程,因此可能回事程序较大,运行较慢。相对与汇编语言,C语言更加适合一些较大型项目的开发。

当然也可以使用C语言与汇编联合编程,将两者的长处相结合。

88457908_1

88457908_2

88457908_3

88457908_4

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值