本章涉及的汇编指令繁多,笔记中没有涉及,需要时直接翻阅教材

第三章 程序的机器级表示


计算机执行机器代码,用字节序列编码低级的操作,包括处理数据、管理内存、读写存储设备上的数据,以及利用网络通信。

产生汇编代码


linux> gcc -Og -S test.c    // 产生test.s汇编文件  
linux> gcc -Og -c test.c    // 编译文件并产生目标代码test.o,是二进制格式  
linux> objdump -d test.o   // 反汇编,根据机器代码产生一种类似于汇编代码的格式  
linux> gcc -Og -o prog main.c test.c  // 链接两个文件并编译产生可执行文件prog  
linux> objdump -d prog  // 反汇编  
// 汇编代码中以.开头的行都是指导汇编器和链接器工作的伪指令  

过程调用


过程P调用过程Q,Q执行后返回到P,这个动作包括以下机制:

  1. 传递控制:进入过程Q时,程序计数器必须设置为Q的代码起始地址,然后在返回时要把程序计数器设为P中调用Q后面那条指令的地址。
  2. 传递数据:P必须能够向Q提供一个或多个参数,Q必须能够向P返回一个值。x86-64中可以通过寄存器最多传送6个整型参数(例如整数和指针,指针都是8字节的),寄存器的使用是有特殊顺序的,寄存器使用的名字取决于要传递的数据类型大小(%rdi,%edi,%di,%dil),参数超过6个则需要通过栈来传递,通过栈传递参数时数据大小需要向8的倍数对齐。
  3. 分配和释放内存:开始时Q可能需要为局部变量分配空间,返回前释放这些存储空间。

栈和程序寄存器存放着传递传递控制和数据、分配内存所需要的信息。当P调用Q时,控制和数据信息添加到栈尾;当P返回时,这些信息会被释放掉。

数据对齐


对齐数据可以提高内存系统性能,原则是 任何K字节的基本对象地址必须是K的倍数
汇编代码.align 8表示后面数据的起始地址是8的倍数。

GDB调试器


用下面命令可以启动GDB调试器:

// 启动gdb调试器,其中proc为可执行程序  
// gdb调试器中,使用help获取GDB信息,info frame获取栈帧信息,info registers获取寄存器值  
linux> gdb prog  

评论

还没有登陆?评论请先登陆注册

还没有评论,抢个沙发吧!

 联系方式 contact me

Github
Email
QQ
Weibo