《庖丁解牛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中的值入栈,用movsubl(类似减发指令)指令来解释就是:

subl $4,%esp
movl %eax,(%esp)

这里还需要解释一点东西,栈的基本结构是这样的:

当有新的元素入栈时,首先需要修改栈顶元素的地址,将其缩小,至于为什么是-4,我就不知道原因了。

接着,将结果存入栈顶元素对应的地址中,注意,这里不能写成movl %eax,%esp的形式,这样会将结果保存进esp寄存器中,而非其所对应的内存地址。

pop 指令

pop %eax

这里代表将栈的栈顶元素保存进eax中。

movadd指令来解释就是:

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内核》笔记之:汇编基础相关推荐

  1. 《庖丁解牛Linux内核》笔记之:调用堆栈

    <庖丁解牛Linux内核>笔记之:调用堆栈 参考视频 基础知识介绍 在基础知识里讲过在使用cal调用函数时,会在之前的堆栈上创建一个新的堆栈,这里想讨论的就是如何实现调用函数时的参数传递. ...

  2. 庖丁解牛linux内核 百度云,庖丁解牛Linux内核分析笔记-1

    2019-5-3 主要内容摘自 孟宁<庖丁解牛Linux内核分析> 天下大事必作于细,天下难事必作于易 1.计算机三大法宝 存储程序计算机 函数调用堆栈 中断 2.虚拟一个x86的CPU硬 ...

  3. 庖丁解牛山linux内核的析,# 庖丁解牛Linux内核分析笔记-1

    2019-5-3 主要内容摘自 孟宁<庖丁解牛Linux内核分析> 天下大事必作于细,天下难事必作于易 1.计算机三大法宝 存储程序计算机 函数调用堆栈 中断 2.虚拟一个x86的CPU硬 ...

  4. 庖丁解牛linux内核 百度云,庖丁解牛Linux内核-1

    这个文集是用来记录 庖丁解牛Linux内核 这个课程的笔记和作业.错误之处,恳请指出. 实验目地 通过这个实验,主要了解到C函数的调用在汇编层面的逻辑. 实验内容 C程序 首先我们准备了一个简单的函数 ...

  5. 史上最牛最强的linux学习笔记 10.shell基础

    史上最牛最强的linux学习笔记 10.shell基础 写在最前面: 本文是基于某站的视频学习所得,第一个链接如下: https://www.bilibili.com/video/BV1mW411i7 ...

  6. Linux内核笔记--内存管理之用户态进程内存分配

    内核版本:linux-2.6.11 Linux在加载一个可执行程序的时候做了种种复杂的工作,内存分配是其中非常重要的一环,作为一个linux程序员必然会想要知道这个过程到底是怎么样的,内核源码会告诉你 ...

  7. linux内核自旋锁解释,LINUX内核笔记:自旋锁

    目录 1.自旋锁作用与基本使用方法? 与其他锁一样,自旋锁也用于保护临界区,但是自旋锁主要是用于在SMP上保护临界区.在SMP上,自旋锁最多只能被一个可执行线程持有,如果一个线程尝试获得一个被争用的自 ...

  8. Linux内核笔记006 - 交换分区

    本文转自网络文章,内容均为非盈利,版权归原作者所有. 转载此文章仅为个人收藏,分享知识,如有侵权,马上删除. 原文作者:jmpcall 专栏地址:https://zhuanlan.kanxue.com ...

  9. 庖丁解牛Linux内核分析01:操作系统工作原理基础

    目录 1 存储程序计算机工作模型 2 IA-32汇编基础 2.1 寄存器概述 2.1.1 通用寄存器 2.1.2 段寄存器 2.1.3 标志寄存器 2.2 数据格式 2.3 寻址方式 2.3.1 立即 ...

最新文章

  1. linux ubuntu make 安装
  2. 转:Jeff Dean的Stanford演讲
  3. 一句话设置当前控制器的view跟随键盘起伏,妈妈再也不用担心键盘挡住输入框了...
  4. Split和正则表达式的区别
  5. Centos 安装python 3.7 遇到 ModuleNotFoundError: No module named _ctypesmake [install] Error 1(亲测下面的红字内容)
  6. Thinkphp 配置不用输入index.php
  7. 今天的捉蝴蝶真有趣的 格式工厂
  8. 二进制(1):无符号编码和补码编码
  9. vSAN6.2 性能服务
  10. 属兔的人今日运势-360星座网_明日运势属兔人(12.25)
  11. 3DS更新R4烧录卡内核
  12. 用java怎么实现多语言翻译_快速实现中文翻译多国语言
  13. LabVIEW使用 NI Package Manager(NIPM)修复软件
  14. MySQL+Navicat安装教程
  15. Chrome的在线自动字幕辅助工具
  16. Microsoft SQL Server认证方式的修改
  17. 那些年,美团里的年轻人
  18. 关于‘-[UIViewController _loadViewFromNibNamed:bundle:] loaded the “XXXView“ nib but the view outlet wa
  19. 数据库触发器(转自http://blog.csdn.net/chinayuan/article/details/6292335/#)
  20. 输入整形(Input Shaping)——一种振动抑制方法

热门文章

  1. 8 大主流自媒体平台优缺点分析以及运营建议
  2. 【学习笔记+习题集】字符相关(输入输出流,字典树,AC自动机,后缀自动机)(4598字)(更新至2022.12.28)
  3. 冲突杀手meld -- git使用meld作为对比或合并工具_zhou
  4. G.7xx 音频压缩标准
  5. 音频质量评价体系那些事
  6. MaxEnt运行错误
  7. java打印 X XX XXX XXXX
  8. 支持一对多脱机克隆,ORICO发布三款便携式硬盘对拷机 - 超能网
  9. 他是对标芝麻信用和腾讯征信的“中外混血富二代”ZRobot CEO
  10. kafka集群搭建教程(使用自带的zookeeper)