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

2023-07-29,,

姓名:吕松鸿

学号:20135229

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

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

一、存储程序计算机

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 常见汇编指令

    后缀的b,w,l,q分别代表8,16,32,64位
    以%标识的寄存器寻址不与内存“打交道”
    直接寻址&立即数寻址

      movl $0x123,%eax —— %eax=0x123
      movl 0x123,%eax —— 立即数是以$开头的十六进制数值。直接访问指定的内存地址(0x123)中的数据然后赋给%eax

    变址寻址  movl 4(%ebx),%edx//edx = *(inet_32 *)(ebx+4),即ebx的值加4之后作为一个地址,将其指向的数据赋给%edx
    大多数指令都可以直接访问内存地址
    Linux使用的A&T汇编格式与Intel汇编略有不同

    几条重要的汇编指令

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

    函数应该如下:

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

实验部分

实验步骤

实验代码:

代码汇编结果

实验分析如图:

实验总结:

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

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

第一周:通过汇编一个简单的C程序,分析汇编代码理解计算机是如何工作的的相关教程结束。

《第一周:通过汇编一个简单的C程序,分析汇编代码理解计算机是如何工作的.doc》

下载本文的Word格式文档,以方便收藏与打印。