作业1:计算机是如何工作的?20135115臧文君

计算机是如何工作的?

注:作者:臧文君,原创作品转载请注明出处,《Linux内核分析》MOOC课程http://mooc.study.163.com/course/USTC-1000029000

一、存储程序计算机工作模型

1、冯诺依曼体系结构:指存储程序计算机

(1)硬件的角度:分为CPU+内存+总线

CPU中的一个寄存器---IP:Instruction Pointer,指向内存的CS:Code Segment

16位的CPU上叫IP,32位叫EIP,64位叫IIP

CPU通过IP从内存中取一条指令执行,执行过后,IP自加1,再取下一条指令执行

(2)程序员的角度:内存保存指令和数据,CPU负责解释和执行指令,两者通过总线连接

2、API:程序员与计算机的接口界面  Application Program Interface

ABI:程序与CPU的接口界面,二进制的接口,主要是指令编码  Application Binary Interface

二、X86汇编基础

1、X86 CPU的寄存器

(1)通用寄存器

16-bit:AX,BX,CX,DX.BP,SI,DI,SP

32-bit:EAX,EBX,ECX,EDX.EBP,ESI,EDI,ESP

*注*:堆栈是计算机中非常基础性的东西

(2)段寄存器:CS,DS,ES,SS,FS,GS

代码段和堆栈段寄存器使用最多

CPU在实际取指令时根据cs:eip来准确定位一个指令

(3)标识寄存器:EFLAGS register

用于标识当前的状态

*注*:X86_64 Registers寄存器,与32位的在核心机制上差别不大,其通用寄存器扩展成64位,前面标R。

2、X86汇编指令一(mov指令及几种内存寻址方式)

b--8位,w--16位,l--32位,q--64位

 

(1)寄存器寻址register mode

以%开头的寄存器标示符,与内存无关

例:movl %eax,%edx    edx=eax;

(2)立即寻址immediate

立即数是以$开头的数值,与内存无关

例:movl $0x123,%edx    edx=0x123;   0x:16进制

(3)直接寻址direct

直接访问一个指定的内存地址的数据

例:movl 0x123,%edx    edx=*(int32_t*)0x123;

这里的0x123指内存地址为16进制数123,将该地址中的数据放到edx中

(4)间接寻址indirect

将寄存器的值作为一个内存地址来访问内存

例:movl (%ebx),%edx    edx=*(int32_t*)ebx;

ebx这个寄存器存的值是一个内存地址,加()表示之歌内存地址存储的数据

(5)变址寻址displaced

变址寻址在间接寻址之时改变寄存器的数值

例:movl 4(%ebx),%edx    edx=*(int32_t*)(ebx+4);

注:AT&T汇编格式与Intel汇编格式略有不同

Linux内核使用的是AT&T汇编格式

3、X86汇编指令二(push,pop,call,ret)

ebp--栈底,esp--栈底,栈是向下增长

push压栈,pop弹栈

 call函数调用堆栈,是理解C代码在CPU上执行的关键

将当前的eip压栈,再将其附一个新值

ret将call时保存的eip值再还原到eip寄存器中

注:*代表这些指令不能被程序员直接使用,属于伪指令,因为eip寄存器不能被直接修改,只能通过特殊指令间接修改

4、分析几个汇编指令片段

(1)

分析:

(2)

分析:

(3)

分析:

三、汇编一个简单的C程序分析其汇编指令执行过程

编译语句:gcc -S -o -main.s main.c -m32

在编译好的文件中,所有以.开头的内容都是用于链接时的辅助信息,在实际中不会被执行,因此可以删除,留下纯汇编代码。

enter将栈置为空

leave撤销函数堆栈

函数调用堆栈是由逻辑上多个堆栈叠加起来的

函数的返回值默认使用eax寄存器存储返回给上一级函数

四、实验部分

在学习过了孟老师的视频教学之后,实验做起来相对容易一些。

1、我使用ls命令查看了当前目录下的文件,进入Code/shiyanlou_cs195目录下进行代码编写。

2、创建main.c文件,编写代码,我将所给的示例程序中的数值进行了修改。

3、保存之后,使用gcc -S -o main.s main.c -m32命令生成汇编语言文件。

4、打开main.s文件,里面是C程序对应的汇编语言。

5、为了分析方便,将所有以.开头的语句都删除,我查了一下Linux环境下的命令,可以用dd直接删除一行代码,剩下的就是纯汇编代码。

6、分析

通过这次实验,使我对如何反汇编一个C程序有了一定了解,使用gcc -S -o main.s main.c -m32命令,-m32主要是指生成32位的格式。另外,调用其它函数时,将指令指针入栈保存,以便函数执行结束能返回来继续下一条指令的执行,相当于push eip。函数参数入栈,参数入栈顺序是从右到左进栈。函数退出时,将esp赋值给ebp,从而释放当前函数所使用的栈空间。

五、总结

这次课程学习的内容主要围绕计算机是如何工作的,学习了计算机的冯诺依曼体系结构、X86 CPU寄存器、寄存器的寻址方式和一些汇编指令,并通过实验巩固对知识的理解。

我觉得计算机的工作依靠的就是一条条汇编语句的执行,CPU通过IP从内存中取一条指令执行,在堆栈中根据指令找到相应地址,将其内容返回到内存中,然后IP自加1,再取下一条指令执行。汇编语言是计算机可以识别的语言,因此我们理解起来没有C语言那样简洁明了。所以我觉得在分析一段汇编代码的时候,需要自己动手画出堆栈的变化,从而准确清晰的了解每一步堆栈的变化。再如call、ret、enter、leave指令,我们要熟记他们对应的ip/bp/sp的操作变化,从而加快我们对代码的分析。

时间: 2024-12-08 22:12:58

作业1:计算机是如何工作的?20135115臧文君的相关文章

作业7:可执行程序的装载 20135115臧文君

可执行程序的装载 注:作者:臧文君,原创作品转载请注明出处,<Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000 一.预处理.编译.链接和目标文件的格式 1.可执行程序是怎么来的? 例:C语言代码-->编译器预处理-->编译成汇编代码-->汇编器编译成目标代码-->链接成可执行文件,再由操作系统加载到内存中执行 (1)预处理.cpp:负责把include的文件包含进来及宏替换等工作. gcc

Linux内核分析期末总结 20135115臧文君

Linux内核分析期末总结 注:作者:臧文君,原创作品转载请注明出处,<Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000 一.计算机是如何工作的 1.参考链接:http://www.cnblogs.com/CatherineZang/p/5218570.html 2.编译语句:gcc -S -o main.s main.c -m32 3.“三个法宝” (1)存储程序计算机工作模型,计算机系统最最基础性的逻辑结构:

20135115臧文君---实验1

北京电子科技学院(BESTI) 实     验    报     告 课程:Java        班级:1351班     姓名:臧文君    学号:20135115 成绩:             指导教师:娄嘉鹏      实验日期:2015.4.17 实验密级:无       预习程度:             实验时间:15:30-18:00 仪器组次:         必修/选修:选修             实验序号:一 实验名称:   Java开发环境的熟悉 实验目的与要求: 1

20135115臧文君---实验3

北京电子科技学院(BESTI) 实     验    报     告 课程:Java    班级:1351班      姓名:臧文君    学号:20135115 成绩:             指导教师:娄嘉鹏       实验日期:2015.6.4 实验密级:无       预习程度:           实验时间:15:30-18:00 仪器组次:         必修/选修:选修     实验序号:二 实验名称:  敏捷开发与XP实践 实验目的与要求: 1.没有Linux基础的同学建议先

课本学习笔记1:第一、二章 20135115臧文君

第一章 Linux内核简介 注:作者:臧文君,原创作品转载请注明出处. 一.Unix的历史 1.1969年,Dennis Ritchie和Ken Thompson,Unix. 2.Unix产生于贝尔试验室的一个失败的多用户操作系统Multics. 第一个被广泛使用的Unix版本是第6版,称为V6. 3.进一步开发: 加州大学伯克利分校:BSD(Berkeley Software Distributions). 4.Unix系统强大的根本原因:策略和机制分离的设计理念,确保了Unix系统具备清晰的

20135115臧文君---实验4

北京电子科技学院(BESTI) 实     验    报     告 课程:Java    班级:1351班      姓名:臧文君    学号:20135115 成绩:             指导教师:娄嘉鹏       实验日期:2015.6.9 实验密级:无       预习程度:           实验时间:15:30-18:00 仪器组次:         必修/选修:选修     实验序号:四 实验名称:  服务器与客户端间传送信息加解密 实验目的与要求: 1.没有Linux基础

作业3:构造一个简单的Linux系统MenuOS 20135115臧文君

构造一个简单的Linux系统MenuOS 注:作者:臧文君,原创作品转载请注明出处,<Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000 一.Linux内核源代码介绍 1.根目录 arch/x86目录下的代码是我们重点关注的,arch中包括支持不同CPU的源代码. init目录下包含内核启动相关的代码,如main.c(start_kernel函数相当于普通C程序的main函数,是Linux内核初始化的起点). ipc

作业6:进程的描述和进程的创建 20135115臧文君

进程的描述和进程的创建 注:作者:臧文君,原创作品转载请注明出处,<Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000 一.进程的描述 操作系统的三大功能:进程管理,内存管理和文件系统. 1.进程描述符task_struct数据结构 (1)进程控制块PCB---task_struct (2)进程描述符提供了内核所需了解的进程信息. task_struct中包含:进程状态,进程打开的文件,进程优先级信息. tty_st

课本学习笔记5:第七章 20135115臧文君

第七章 链接 注:作者:臧文君,原创作品转载请注明出处. 一.概述 1.链接(linking):是将各种代码和数据部分收集起来并组合成为一个单一文件的过程,这个文件可被加载或被拷贝到存储器并执行. 2.链接可以执行于编译时.加载时和运行时. 3.链接器(linker):分离编译. 链接通常是由链接器执行. 二.编译器驱动程序 1.大多数编译系统提供编译驱动程序(compiler driver),它代表用户在需要时调用语言预处理器.编译器.汇编器和链接器. 例:ASCII码源文件-->可执行目标文