Linux操作系统分析学习第一周感悟
来源:互联网 发布:c语言if语句例题 编辑:程序博客网 时间:2024/06/06 05:48
【自己的废话】
这是我的第一篇博客,献给我伟大的linux系统。
开始了Linux操作系统的第一周的学习,感触良多。对于计算机我是一个门外汉(以前是扭螺丝的),而对于linux系统那就更不用说了。在此课程之前曾在培训班学习过一段时间的linux系统,不过那是很久远,很久远的事情了,对于linux系统只是了解点了皮毛。
都说好奇害死猫,对于linux系统我充满了好奇心,现在要害死我了,我希望对linux系统了解更加的多一点点。
第一周主要是针对汇编语言的复习,汇编语言是一门晦涩难懂的语言,但是又是一门很接地气(接近硬件,接近操作系统)的语言,若是能够了解少许更是极好的;
如何将一段c程序转换成汇编代码呢?
在linux环境下,使用gcc编译器编译。
c代码如下:
int g(int x) { int g(int x) { return x + 3; } int f(int x) { return g(x); } int main(void) { return f(8) + 1; }
通过编译命令:
gcc -S -o main.s main.o -m32(生成32位机的指令)
汇编代码如下:
g: pushl %ebp movl %esp, %ebp movl 8(%ebp), %eax addl $3, %eax popl %ebp ret f: pushl %ebp movl %esp, %ebp subl $4, %esp movl 8(%ebp), %eax movl %eax, (%esp) call g leave main: pushl %ebp movl %esp, %ebp subl $4, %esp movl $8, (%esp) call f addl $1, %eax leave ret
为了获得更加纯粹的汇编代码,将生成的汇编代码文件中会存在很多以.开通的语句(表示链接)删除掉;
分析汇编代码的过程中,我学到了什么呢?
mov指令的及集中内存寻址方式(b, w, l, q依次表示8位,16位,32位,64位,话说小白的我以前真不知道)以%开头的寄存器标识符,立即数是以$开头的数值寄存器寻址:movl %eax, %edx edx = eax; register mode (将eax寄存器中的内容放到edx寄存器中)立即数寻址:movl $0x123, %edx edx = 0x123; immediate (把0x123数值放到寄存器edx中)直接寻址:直接访问一个指定的内存地址的数据movl 0x123, %edx edx = *(int32_t*)0x123; direct (把地址为0x123的内存数据放到寄存器edx中)间接寻址:将寄存器中的值作为一个内存地址来访问内存movl (%ebx), %edx edx = *(int32_t*)ebx; indirect(将寄存器ebx的值看成内存地址,将该地址的对应的内存数值放点寄存器edx中)变址寻址:movl 4(%ebx), %edx edx = *(int32_t*)(ebx + 4); displaced(变址寻址);(将寄存器ebx的地址加4得到的新地址的内存数值放到寄存器edx中)堆栈是向下增长的
pubshl %eax: subl $4, %esp movl %eax, (%esp) // 将寄存器eax中的内存数值放入到寄存器esp存放的内存地址中去 pop %eax : movl (%esp)x addl $4 %esp call 0x12345 : push %eip(*) movl $0x12345 %eip(*) //不允许程序员直接操作eip等寄存器 ret: popl %eip(*) enter: pushl %ebp movl %esp,%ebp leave: movl %ebp, %esp popl %ebp
好了,第一篇博客写完了,我知道一定很low,不过开始嘛,都是这样一个过程了,哈哈~~~希望若干年后的自己看着不要太脸红啊……
2017年9月9日
写于上海徐汇区
- Linux操作系统分析学习第一周感悟
- GeekBand C++第一周学习感悟
- 学习Linux:第一周
- LINUX学习第一周
- 课外读物感悟-第一周
- linux 学习第一周小结
- 操作系统 : 第一周作业
- Linux内核分析第一周课程小结
- python学习第一周--需求分析
- LINUX内核分析第一周学习总结:计算机是如何工作的?
- Hive学习使用一周感悟
- Linux内核分析,c程序汇编代码分析--第一周
- 操作系统原理第一周:操作系统概述
- 《核心分析》第一周
- 算法分析第一周
- 实习第一周(第一天)(安装linux,学习python)
- 操作系统学习笔记(42)--感悟
- 学习JAVA 第一周
- ITASCA PFC 2D&3D DISCERETE ELEMENT MODELING
- mysql workbench中PK,NN,UQ,BIN,UN,ZF,AI字段类型标识说明
- 【recover-binary-search-tree】
- pat 乙级 1056. 组合数的和(15)
- JS(1)
- Linux操作系统分析学习第一周感悟
- Django 文件上传
- C#基础-050 结构
- 关于JAVA中的static方法、并发问题以及JAVA运行时内存模型
- Linux后端开发
- uva 156 Ananagrams STL
- Xcode报错:embedded dylibs/frameworks are only supported on iOS 8.0 and later
- eventlet.event.Event
- JAVA设计模式---适配器模式