通过汇编一个简单的C程序,分析汇编代码理解计算机是如何工作的

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了通过汇编一个简单的C程序,分析汇编代码理解计算机是如何工作的相关的知识,希望对你有一定的参考价值。

姓名:吕松鸿 

    学号:20135229

( *原创作品转载请注明出处*)

( 学习课程:《Linux内核分析》MOOC课程http://mooc.study.163.com/course/USTC-1000029000 )

一、存储程序计算机

1.1冯诺依曼体系结构:即具有存储程序的计算机体系结构

目前大多数拥有计算和存储功能的设备(智能手机、平板、计算机等)其核心构造均为冯诺依曼体系结构

  1. 从硬件来看
  • CPU与内存通过主线连接,CPU上的IP(可能是16、32、64位)总指向内存的某一块区域;IP指向的CS(代码段)也在内存中;CPU总是执行IP指向的指令。

     2. 从软件来看

  • API(应用程序编程接口,与编程人员)与ABI(程序与CPU的借口界面) 是两个比较重要的软件接口

1.2 

关于ABI:指令编码;指令中涉及的寄存器布局;大多数指令可以直接访问内存

1.3 

(E代表32位系统)EIP在CPU执行完一条指令之后自加一(自动加一条指令,而不是一个字节或是32位),当然也可以被其它指令,如CALL,RET等修改

二、x86汇编基础

2.1 x86(32位)的寄存器中,低16位作为16位register

2.2 关于堆栈段寄存器

EBP(堆栈基址寄存器);ESP(堆栈顶指针寄存器)。上述两个寄存器较为频繁地使用于汇编程序中

2.3 关于代码段寄存器

CPU实际取指令的时候通过cs:eip来描述

2.4 64位CPU

其实与32位在核心机制上差别不大,64位的机器中,寄存器以RXX表示

2.5 常见汇编指令

  1. 后缀的b,w,l,q分别代表8,16,32,64位
  2. 以%标识的寄存器寻址不与内存“打交道”
  3. 直接寻址&立即数寻址
    1. movl $0x123,%eax —— %eax=0x123
    2. movl 0x123,%eax —— 立即数是以$开头的十六进制数值。直接访问指定的内存地址(0x123)中的数据然后赋给%eax
  4. 变址寻址  movl 4(%ebx),%edx//edx = *(inet_32 *)(ebx+4),即ebx的值加4之后作为一个地址,将其指向的数据赋给%edx
  5. 大多数指令都可以直接访问内存地址
  6. Linux使用的A&T汇编格式与Intel汇编略有不同
  7. 几条重要的汇编指令


技术分享

2.6汇编小程序练习

技术分享

 

技术分享

三、汇编一个简单的C程序

3.1 将C代码编译成汇编代码

  • 将代码在实验楼环境中(64位)保存之后,建议使用 -m32将其编译为32位的汇编代码
  • 具体如下:

     gcc -S -o main.s main.c -m32
    
  • 关于leave指令
    • leave指令与enter指令一起相当于两条宏指令
    • 技术分享
    • enter指令相当于在原来的堆栈上再建一个新的空堆栈【因为将栈底指针%ebp挪到和栈顶指针相同的位置了】
    • leave指令与enter相反,相当于撤销函数调用堆栈【把栈顶指针提上来,则撤消了该栈】
  • 函数调用堆栈是由逻辑上多个堆栈叠加起来的。
  • 函数的返回值默认用%eax存储,然后返回给上一级函数。

3.2 练习2

技术分享

 

  1. 函数应该如下:

    int g(int x)
    {
        return x+8;
    }
    int main(void)
    {
        return g(8)-8;
    }

 实验部分

实验步骤

技术分享

实验代码:

技术分享

代码汇编结果

技术分享

 

实验分析如图:

技术分享

实验总结:

1.计算机的硬件设施部分,就如第一讲中讲到的那样,除了核心CPU之外,还有寄存器、高速缓存、主存乃至外存这样种类繁多的存储设备。存储设备(这也是冯 诺依曼体系结构的一个重要支点)根本目的就是为CPU服务,存储各种各样的、区分轻重缓急的数据;

2.一步一步对汇编语言进行分析,使我对堆栈的调用认识更加深刻,对这部分的知识更加了然于胸,对我今后的课程奠定了扎实的基础

以上是关于通过汇编一个简单的C程序,分析汇编代码理解计算机是如何工作的的主要内容,如果未能解决你的问题,请参考以下文章

通过汇编一个简单的C程序,分析汇编代码理解计算机是如何工作的

理解计算机的工作方式——通过汇编一个简单的C程序并分析汇编代码

通过汇编一个简单的C程序,分析汇编代码理解计算机是如何工作的

通过汇编一个简单的C程序,分析汇编代码理解计算机是如何工作的

Linux内核分析第一周-通过分析汇编代码理解计算机是如何工作的

c与汇编