机器级目标代码文件是什么

机器级目标代码文件是什么,第1张

能够立即执行的机器语言代码,待装配的机器语言模块,汇编语言程序。

机器级目标代码文件,目标代码生成编译程序。最后一个阶段是目标代码生成,它通常在语义分析后或者优化后的中间代码上进行,并将中间代码转化为等价的目标代码。目标代码有三种形式。

1,能够立即执行的机器语言代码。他们通常存放在固定的存储区中,编译后可直接执行。

2,待装配的机器语言模块。当需要执行起时,由连接装配程序,把他们与另外一些运行子程序连接起来,组合成可执行的机器语言代码。

3,汇编语言程序,必须通过汇编程序汇编成可执行的机器语言。

10位。

在计算机编程中,机器代码是任何低级编程语言,由机器语言指令组成,用于控制计算机的中央处理器(CPU)。每条指令都会使CPU执行一项非常具体的任务,例如对CPU寄存器或内存中的一个或多个数据单元进行加载、存储、跳转或算术逻辑单元(ALU) *** 作。

机器代码是一种严格的数字语言,旨在尽可能快地运行,并且可以被视为已编译或组装的计算机程序的最低级别表示,或者被视为原始和依赖于硬件的编程语言。虽然可以直接用机器代码编写程序,但手动管理单个位和计算数字地址和常数是乏味且容易出错的。出于这个原因,在现代环境中,程序很少直接用机器代码编写,但可以用于低级调试、程序修补(特别是当汇编源代码不可用时)和汇编语言反汇编.

华为面试题:怎样判断栈的增长方向

在华为面试中有这么一道考试,请给出栈增长方向的判断方法。下面一起来看看这道题的参考答案,仅供大家参考!

该题目属于考查计算机组成原理中栈结构知识的题目。其参考答案如下:

可以编写一个带有过程(函数)调用的C程序,然后按照以下方法进行判断(采用类似思想,还可以写出许多答案)。

方法一:通过比较被调用过程中的入口参数所在地址和局部变量所在地址之间的大小来判断。若入口参数所在地址大于局部变量所在地址,则栈是向低地址增长的。

方法二:直接阅读汇编指令来判断。例如,在IA-32中,如果在一个过程的开始阶段(准备段)出现类似“sub $0x10,%esp”指令,说明栈顶指针(%esp)是变小的,因此栈是向低地址增长的。

方法三:显示栈顶指针寄存器的内容。在某个过程的开始阶段和结束阶段分别显示栈顶指针寄存器的内容,比较它们的大小。若开始处的值比结束处的大,则说明栈是向低地址增长的。

后面两种方法,需要对程序的机器级代码(汇编指令)进行调试,例如,利用Linux系统中的程序调试工具软件GDB进行调试。

该题是开放题目,答案应该没有唯一性。通过这个题目的回答可以考查出学生对计算机系统中栈结构的掌握情况。

栈是存储空间中的一个区域,分用户栈和内核栈两种类型。用户栈主要用来存放用户进程每次过程(函数)调用时,在被调用过程中使用的局部信息,每次过程调用都在栈中生长出一个新的栈帧,因此,栈帧是通过执行相应的指令动态生长出来的内核栈是 *** 作系统内核中的动态存储区域,用于保存 *** 作系统内核和硬件所需要的动态信息。

在采用虚拟存储管理机制的系统中,内核栈和用户栈都是虚拟地址空间中的一个存储区。每个源程序经编译、汇编、链接等处理生成可执行的二进制机器目标代码时,每个程序的目标代码都被映射到同样的虚拟地址空间,所有用户进程的虚拟地址空间是一致的。例如,图1给出了在IA32/Linux *** 作系统下hello程序的一个进程对应的虚拟地址空间映像。它分为两大部分:内核区(kernelarea)和用户区(userarea)。

从图1可以看出,内核区在0xC0000000以上的高端地址上,用来存放 *** 作系统内核代码和数据以及与每个进程相关的数据结构(如进程标识信息、进程现场信息、页表等进程控制信息以及内核栈等),其中内核代码和数据区在每个进程的地址空间中都相同。用户程序没有权限访问内核区。

用户区用来存放用户进程的代码和数据,它被分为以下几个区域。

(1) 用户栈。用来存放程序运行时过程调用的参数、返回值、返回地址、过程局部变量等,随着程序的执行,该区会不断动态地从高地址向低地址增长或向反方向减退。

(2) 共享库。用来存放公共的共享函数库代码,如hello中的printf( )函数等。

(3) 堆。用于动态申请存储区,例如,C语言中用malloc()函数分配的存储区,或C++中用new *** 作符分配的存储区。申请一块内存时,动态地从低地址向高地址增长,用free( )函数或delete *** 作符释放一块内存时,动态地从高地址向低地址减退。

(4) 可读写数据区。存放用户进程中的静态全局变量,堆区从该区域的结尾处开始向高地址增长。

(5) 只读数据和代码区。存放用户进程中的代码和只读数据,如hello进程中的程序代码和字符串“hello,world\n”。

每个区域都有相应的'起始位置,堆区和栈区相向生长,栈区从内核起始位置0xC0000000开始向低地址增长,堆栈中的共享库代码区从0x40000000开始向高地址增长。代码和只读数据区从0x08048000开始向高地址增长。

对于栈的访问 *** 作,有些指令集系统结构提供了专门的入栈和出栈指令,例如Intel架构中的push指令和pop指令分别用于入栈和出栈 *** 作有些架构则不提供专门的入栈和出栈指令,而是通过访存指令和加/减指令来实现入栈和出栈 *** 作,例如,MIPS架构中用sw指令和add或sub指令实现入栈 *** 作,用lw指令和add或sub指令实现出栈 *** 作。

对于像Intel这样提供专门入栈和出栈指令的情况,栈的增长方向可以根据入栈、出栈指令的功能来确定,例如,IA-31架构中的push指令自动将栈顶指针减4,而pop指令则自动将栈顶指针加4。因而,栈总是从高地址向低地址增长。

对于像MIPS架构这种没有专门入栈和出栈指令的情况,栈的增长方向就不一定,可能是高地址向低地址增长,或是相反。

因为栈是通过执行指令动态增长的,所以,最直接的判断办法就是在机器级代码层面(通常是汇编指令)来阅读或调试程序。

当一个过程P调用一个被调用过程Q,则P中传递给Q的参数会先入栈,然后执行调用指令(如IA-32中的call指令),跳转到Q执行,在被调用过程Q中,再将Q的局部变量入栈,因此,通过比较Q过程的入口参数所在地址和局部变量所在地址之间的大小,可以判断出栈的增长方向。


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/12081843.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-20
下一篇 2023-05-20

发表评论

登录后才能评论

评论列表(0条)

保存