《庖丁解牛Linux内核》笔记之:汇编基础
《庖丁解牛Linux内核》笔记之:汇编基础
参考视频
下面的说法都来自x86CPU寄存器。
值的不同表示方法
%eax
类似这种就是直接操作该寄存器,效果类似于C语言中的指针:*
和&
。
(%eax)
这里代表()
中的内容是一块地址,而(%eax)
代表直接读取其中的地址对应的值。
$123
这里的代表的是具体的值,即十进制的123。
123
这种只有一个数值的,代表其本身是一个地址。
常见寄存器
- eax:累加寄存器,主要用来临时存放运算结果
- ebx:基地址寄存器,顾名思义,这里存储的就是一个内存地址,然后在其他指令中可以通过在该基础地址上进行加减,来获取其他地址
- ecx:计数寄存器,看不懂介绍,等遇到再说吧
- edx:数据寄存器,顾名思义,就是用来存放数据的
- ebp:堆栈基指针,顾名思义,就是用来存放堆栈的地址的
- esp:堆栈顶指针,顾名思义,就是用来存放栈顶的内存地址
- esi:变址寄存器,看不懂介绍
- edi:变址寄存器
- eip:CPU指令寄存器,即保存当前CPU执行的指令。
mov 指令
视频地址
类似movl
,movb
这种都是mov
指令,其中:
指令 | 解释 |
---|---|
movb | 8位 |
movw | 16位 |
movl | 32位 |
movq | 64位 |
使用例子:
寄存器模式
movl %eax,%edx
这个指令代表将eax
中的值复制到edx
中。
类似到C语言就是:
edx=eax;
立即数模式
movl $0x123,%edx
这里的$0x123
代表的是具体的值,$
代表这是个数值,0x123
中的0x
代表16进制数。123
代表的是16进制下数的值。
这个指令代表的含义是将0x123
的值存入edx
寄存器中。
类比到C语言就是:
edx=0x123;
直接寻址模式
movl 0x123,%edx
这里的0x123
的含义类似C语言中的指针,代表的内存中的地址,如果类比到C语言就是:
edx=*(int32_t*)0x123;
(int32_t*)0x123
代表0x123
是一个地址,*(int32_t*)0x123
代表取出其中的值,存入edx
中。
间接寻值
movl (%ebx),%edx
这里跟上面的解释是类似的,只不过这一次的值存在ebx
寄存器中。
变址寻址
movl 4(%ebx),%edx
这里类似于C语言中的:
edx=*(int32_t*)(ebx+4);
push 指令
视频地址
这个主要用来操作栈。
pushl %eax
这个指令代表将eax
中的值入栈,用mov
和subl
(类似减发指令)指令来解释就是:
subl $4,%esp
movl %eax,(%esp)
这里还需要解释一点东西,栈的基本结构是这样的:
当有新的元素入栈时,首先需要修改栈顶元素的地址,将其缩小,至于为什么是-4,我就不知道原因了。
接着,将结果存入栈顶元素对应的地址中,注意,这里不能写成movl %eax,%esp
的形式,这样会将结果保存进esp
寄存器中,而非其所对应的内存地址。
pop 指令
pop %eax
这里代表将栈的栈顶元素保存进eax
中。
用mov
和add
指令来解释就是:
movl (%esp),%eax
addl $4,%esp
这个用上面的模型来解释就很简单了,首先根据栈顶元素的地址将栈顶元素的值保存进eax
中,接着增加栈顶元素的地址的值。
cal 指令
比如
call 0x12345
首先解释它做了什么事情,它让CPU去执行在地址0x12345
处的指令,类似于程序调用。结合栈来解释就是:
pushl %eip
movl $0x12345,%eip
首先,将当前的指令入栈:pushl %eip
,接着将新的指令地址保存进eip
中。
注意,上面的指令是为了说明,程序员不能直接修改eip
的值,只能通过其他指令来间接修改eip
的值。
ret 指令
类似于C语言中的return
,结合栈来理解就是将下一条指令保存进eip
中:
popl %eip
整体的顺序类似于下图这样:
enter 指令
视频地址
常见新的堆栈,用的时候就是:
enter
就可以了,其本质是这样的:
pushl %ebp
movl %esp,%ebp
ebp
上面介绍过,就是栈的基地址,如果要创建一个新的栈,那很简单,首先将之前的基地址入栈,接着将之前的栈顶元素的地址作为新的基地址。
用图来表示就是:
这样就在之前的栈的基础上构建了一个新的栈。这也就是代码中函数的调用开始后,会初始化一个新的栈。
leave 指令
和上面的对应,即销毁一个栈。
movl %ebp,%esp
popl %ebp
这里也用图片解释一下:
然后这里就恢复到了之前的那个栈。
《庖丁解牛Linux内核》笔记之:汇编基础相关推荐
- 《庖丁解牛Linux内核》笔记之:调用堆栈
<庖丁解牛Linux内核>笔记之:调用堆栈 参考视频 基础知识介绍 在基础知识里讲过在使用cal调用函数时,会在之前的堆栈上创建一个新的堆栈,这里想讨论的就是如何实现调用函数时的参数传递. ...
- 庖丁解牛linux内核 百度云,庖丁解牛Linux内核分析笔记-1
2019-5-3 主要内容摘自 孟宁<庖丁解牛Linux内核分析> 天下大事必作于细,天下难事必作于易 1.计算机三大法宝 存储程序计算机 函数调用堆栈 中断 2.虚拟一个x86的CPU硬 ...
- 庖丁解牛山linux内核的析,# 庖丁解牛Linux内核分析笔记-1
2019-5-3 主要内容摘自 孟宁<庖丁解牛Linux内核分析> 天下大事必作于细,天下难事必作于易 1.计算机三大法宝 存储程序计算机 函数调用堆栈 中断 2.虚拟一个x86的CPU硬 ...
- 庖丁解牛linux内核 百度云,庖丁解牛Linux内核-1
这个文集是用来记录 庖丁解牛Linux内核 这个课程的笔记和作业.错误之处,恳请指出. 实验目地 通过这个实验,主要了解到C函数的调用在汇编层面的逻辑. 实验内容 C程序 首先我们准备了一个简单的函数 ...
- 史上最牛最强的linux学习笔记 10.shell基础
史上最牛最强的linux学习笔记 10.shell基础 写在最前面: 本文是基于某站的视频学习所得,第一个链接如下: https://www.bilibili.com/video/BV1mW411i7 ...
- Linux内核笔记--内存管理之用户态进程内存分配
内核版本:linux-2.6.11 Linux在加载一个可执行程序的时候做了种种复杂的工作,内存分配是其中非常重要的一环,作为一个linux程序员必然会想要知道这个过程到底是怎么样的,内核源码会告诉你 ...
- linux内核自旋锁解释,LINUX内核笔记:自旋锁
目录 1.自旋锁作用与基本使用方法? 与其他锁一样,自旋锁也用于保护临界区,但是自旋锁主要是用于在SMP上保护临界区.在SMP上,自旋锁最多只能被一个可执行线程持有,如果一个线程尝试获得一个被争用的自 ...
- Linux内核笔记006 - 交换分区
本文转自网络文章,内容均为非盈利,版权归原作者所有. 转载此文章仅为个人收藏,分享知识,如有侵权,马上删除. 原文作者:jmpcall 专栏地址:https://zhuanlan.kanxue.com ...
- 庖丁解牛Linux内核分析01:操作系统工作原理基础
目录 1 存储程序计算机工作模型 2 IA-32汇编基础 2.1 寄存器概述 2.1.1 通用寄存器 2.1.2 段寄存器 2.1.3 标志寄存器 2.2 数据格式 2.3 寻址方式 2.3.1 立即 ...
最新文章
- linux ubuntu make 安装
- 转:Jeff Dean的Stanford演讲
- 一句话设置当前控制器的view跟随键盘起伏,妈妈再也不用担心键盘挡住输入框了...
- Split和正则表达式的区别
- Centos 安装python 3.7 遇到 ModuleNotFoundError: No module named _ctypesmake [install] Error 1(亲测下面的红字内容)
- Thinkphp 配置不用输入index.php
- 今天的捉蝴蝶真有趣的 格式工厂
- 二进制(1):无符号编码和补码编码
- vSAN6.2 性能服务
- 属兔的人今日运势-360星座网_明日运势属兔人(12.25)
- 3DS更新R4烧录卡内核
- 用java怎么实现多语言翻译_快速实现中文翻译多国语言
- LabVIEW使用 NI Package Manager(NIPM)修复软件
- MySQL+Navicat安装教程
- Chrome的在线自动字幕辅助工具
- Microsoft SQL Server认证方式的修改
- 那些年,美团里的年轻人
- 关于‘-[UIViewController _loadViewFromNibNamed:bundle:] loaded the “XXXView“ nib but the view outlet wa
- 数据库触发器(转自http://blog.csdn.net/chinayuan/article/details/6292335/#)
- 输入整形(Input Shaping)——一种振动抑制方法
热门文章
- 8 大主流自媒体平台优缺点分析以及运营建议
- 【学习笔记+习题集】字符相关(输入输出流,字典树,AC自动机,后缀自动机)(4598字)(更新至2022.12.28)
- 冲突杀手meld -- git使用meld作为对比或合并工具_zhou
- G.7xx 音频压缩标准
- 音频质量评价体系那些事
- MaxEnt运行错误
- java打印 X XX XXX XXXX
- 支持一对多脱机克隆,ORICO发布三款便携式硬盘对拷机 - 超能网
- 他是对标芝麻信用和腾讯征信的“中外混血富二代”ZRobot CEO
- kafka集群搭建教程(使用自带的zookeeper)