天道酬勤YXJ1 / 电脑 / 汇编语言跟C语言之间不得不说的秘密!

分享

   

汇编语言跟C语言之间不得不说的秘密!

2017-01-03  天道酬勤Y...

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语言与汇编联合编程,将两者的长处相结合。汇编语言跟C语言之间不得不说的秘密!

汇编语言跟C语言之间不得不说的秘密!

汇编语言跟C语言之间不得不说的秘密!

汇编语言跟C语言之间不得不说的秘密!

本文为头条号作者发布,不代表今日头条立场。

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多
    喜欢该文的人也喜欢 更多

    ×
    ×

    ¥.00

    微信或支付宝扫码支付:

    开通即同意《个图VIP服务协议》

    全部>>