首页 > 学院 > 开发设计 > 正文

我的linux入门第一课,从汇编程序看计算机如何运作

2019-11-06 09:27:47
字体:
来源:转载
供稿:网友
           一直以来自己都想入门linux,不得其法,有幸有孟宁老师的课程,太开心了。废话少说开始我的奋斗 之路吧。首先介绍一下我们用的都是存储计算机:关于寄存器的介绍,我就截取自老师的PPT介绍一些汇编指令:一些其他指令:1、pushl %eax把eax压栈到堆栈栈底即首先把esp减4esp表示堆栈栈顶ebp表示堆栈基址2、popl %eax把eax从堆栈栈顶取32位,放在寄存器eax中即首先把栈顶esp的数值放在eax中,再把栈顶加43、call 0x12345调用该地址即将当前的eip(当前CPU执行命令的指针)压栈,赋给eip一个新值(CPU下一条执行的指令4、ret即将call时保存的eip还原到eip寄存器,return call之前的那条指令eip(*)这个*指程序员不能直接修改eip1.接下来我们先从C语言的代码入手,下面是一段简单的C代码例子,用于生成汇编语言,并且分析其执行过程。#include<stdio.h>int g(int x){return x + 5;}int f(int x){return g(x);}int main(void){return f(10) + 1;}2.生成汇编语言的方式,因为课程需要用32位的,我的Ubuntu是64位的,所以需要加上-m32,命令如下:gcc -S -o main.s main.c -m32效果如下图会生成main.s打开main.s,如下:所有带前缀 点的 将不会执行,所以我们将其删除,得到如下图的代码g:pushl %ebpmovl %esp, %ebpmovl 8(%ebp), %eaxaddl $5, %eaxpopl %ebpretf:pushl %ebpmovl %esp, %ebpsubl $4, %espmovl 8(%ebp), %eaxmovl %eax, (%esp)call gleaveretmain:pushl %ebpmovl %esp, %ebpsubl $4, %espmovl $10, (%esp)call faddl $1, %eaxleaveret过程分析见行间回复:g:pushl %ebp12 将ebp压栈,esp加4,指向下一个位置。movl %esp, %ebp13.将esp赋值给ebpmovl 8(%ebp), %eax14ebp变址寻址,ebp加8addl $5, %eax15eax加5后,重新赋值给eax。popl %ebp16.出栈ebpret17 跳转eip,返回结果f:pushl %ebp6. 将ebp压入栈中,esp加1.movl %esp, %ebp7.将esp赋值给ebp。subl $4, %esp8. esp减4movl 8(%ebp), %eax9. 将ebp的值赋值给eaxmovl %eax, (%esp)10. 将eax赋值给esp所指向的空间。call g11.call执行,把当前eip保存,跳转到吓一跳eip执行,执行gleave18 离开eipret19 挑战eip 返回结果main:pushl %ebp1. 首先把ebp的值压入栈,esp减4,指向吓一跳指令movl %esp, %ebp2. 即esp的值赋给ebp,ebp也指向和esp同一个位置。subl $4, %esp3. esp向下移动一个位置movl $10, (%esp)4. 把立即数10赋值给esp所指向的空间。call f5. call命令包含 push eip 和 mov g eip,执行call指令,eip将会运行下一条指令,执行f,并且将现在的eip压入栈中,进行保存,等待调用函数返回后,继续执行。addl $1, %eaxleave20ebp 出栈,返回。ret21. 出栈eip,重新返回总结:Linux操作系统非常优秀,是C语言编写。其本质还是存储式计算机,取指令,完成指令。如果想学好Linux内核,必须学习其思想,需要读《Linux内核设计与实现》等书来加深印象。第一次记录笔记确实有一些粗糙,但是以后会努力的修正,去更细,达到完美。努力成功,努力进步。加油。
发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表