抄写Linux源码(Day7:读闪客文章第二回 “自己给自己挪个地儿”)

news2024/11/19 10:41:56

闪客文章地址:https://mp.weixin.qq.com/s?__biz=Mzk0MjE3NDE0Ng==&mid=2247499274&idx=1&sn=23885b5b1344a1425f5a971d06ad2e7d&chksm=c2c584a7f5b20db1b0a75ea896e7218a9f8bcd006e68f53693bab240b13f9e2fb0ec0c9b9a6a&cur_album_id=2123743679373688834&scene=190#rd

建议点击原链接读闪客的原文

个人读完后,觉得这篇文章重点内容有两个:
1.
在这里插入图片描述
bootsect.s 中,_start 到 go 之间这段代码的作用是:把 bootsect.S 这 512 字节的数据从内存 0x7c00 拷贝到 0x90000 处,随后跳转到 0x90000:go 继续执行代码

rep movw

rep 的意思是:重复执行后面的指令
movw 的意思是:复制一个字 (16 位)
rep movw 则表示,重复复制一个字

那下面自然就有三连问:

重复执行多少次呢?是 cx 寄存器中的值,也就是 256 次。 (由于是 movw,所以一共是 512 字节)

从哪复制到哪呢?是从 ds:si 处复制到 es:di 处。

一次复制多少呢?刚刚说过了,复制一个字,16 位,也就是两个字节。

上面是直译,那把这段话翻译成更人话的方式讲出来就是,将内存地址 0x7c00 处开始往后的 512 字节的数据,原封不动复制到 0x90000 处。

为了达成把 0x7c00 往后 512 字节复制到 0x90000 的目的,我们在执行 rep movw 之前,需要做如下设置:

mov ax,0x07c0
mov ds,ax                    ; 像 ds, es 这种特殊寄存器,不能直接赋值,得通过 ax 等寄存器间接赋值
mov ax,0x9000
mov es,ax
mov cx,#256
sub si,si
sub di,di
rep movw

总结如下图:
在这里插入图片描述
再往后是一个跳转指令。

jmpi go,0x9000
go: 
  mov ax,cs
  mov ds,ax

仔细想想或许你能猜到它想干嘛。

jmpi 是一个段间跳转指令,表示跳转到 0x9000:go 处执行

再次总结,如下图:

在这里插入图片描述
“跳到这” 是第三步

今天到此为止,不得不说,闪客的文章写得真好,又简单又易读,语言还幽默风趣

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/827816.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

jmeter中json提取器,获取多个值,并通过beanshell组成数组

jmeter中json提取器介绍 特别说明:**Compute concatenation var(suffix_ALL)😗*如果找到许多结果,则插件将使用’ , 分隔符将它们连接起来,并将其存储在名为 _ALL的var中 json提取器调试 在查看结果树中选择JSON Pat…

python——案例9:判断字符串的长度

案例8:设定列表:listl[0,1,2,3,4,5],求列表之和total0 list1[0,1,2,3,4,5] #列表lis1for ele in range(0,len(list1)):totaltotallist1[ele] print("列表中元素之和:",total) #输出结果

既要增长又要人效,零售人准备好接受老板的灵魂拷问了吗

增长对于零售行业尤其中小规模的玩家来说重要性不言而喻,而支撑持续增长的引擎之一就是对日常运营数据能随时进行快速、合理的解读,从而在瞬息万变的市场环境和有限的时间窗口内,根据指标背后折射的问题及时调整市场投放和客户关系维护等策略…

MySQL 极速安装使用与卸载

目录 mysql-5.6.51 极速安装使用与卸载 sqlyog工具 mysql简化 mysql-8.1.0下载配置 再完善 mysql-5.6.51 极速安装使用与卸载 mysql-8.1.0下载安装在后 mysql中国官网 MySQLhttps://www.mysql.com/cn/ 点击MySQL社区服务器 点击历史档案 下载完 解压 用管理员运行cmd&a…

原来这就是数组

原来这就是数组 数组的基本概念为什么使用数组数组的概念数组的特点数组如何初始化1.动态初始化2.静态初始化 数组的使用访问数组元素代码演示 遍历数组的几种方式1.直接打印(不可取)2.for循环打印(如果有判断条件推荐)3.转化为St…

stm32常见数据类型

stm32的数据类型的字节长度 s8 占用1个byte,数据范围 -2^7 到 (2^7-1) s16 占用2个byte,数据范围 -2^15 到 (2^15-1) s32 占用 4个byte,数据范围 -2^31 到 (231-1)231 2147483647 int64_t占用8个byte,数据范围 -2^63 到 (2^63-1)…

flutter:占位视图(骨架屏、shimmer)

前言 有时候打开美团,在刚加载数据时会显示一个占位视图,如下: 那么这个是如何实现的呢?我们可以使用shimmer来开发该功能 实现 官方文档 https://pub-web.flutter-io.cn/packages/shimmer 安装 flutter pub add shimmer示例…

渲染中回流与重绘讲解

浏览器的渲染过程 本文先从浏览器的渲染过程来讲解回流与重绘。 从上面这个图上,我们可以看到,浏览器渲染过程如下: 解析HTML,生成DOM树(DOM Tree),解析CSS,生成CSS树(Style Rules)将DOM树和CSS树结合&am…

通过启动盘安装 SylixOS

通过启动盘安装 SylixOS 制作启动盘 将 U 盘插入电脑。 打开 RealEvo-IDE,并在菜单栏选择 Tools > RealEvo-SylixOS-Installer 启动安装工具。 设置启动盘各项参数,如下图红框所示。 单击一键安装 SylixOS。程序运行过程信息输出显示如下图所示。…

c语言~野指针

1、野指针&#xff0c;既没有初始化的指针&#xff0c;//如果没有给指针初始化&#xff0c;则指针p的内容为随机地址&#xff0c;会随机指向&#xff0c;故成为野指针&#xff0c;不可以操作野指针 #include "stdio.h" #include <stdlib.h>int main() {//1、野…

Nginx之正、反向代理

什么是代理 A同学在Ai大时代背景下开启他的创业之路&#xff0c;目前他遇到的最大的一个问题就是启动资金&#xff0c;于是他决定去找马云爸爸借钱&#xff0c;可想而知&#xff0c;最后碰一鼻子灰回来了&#xff0c;情急之下&#xff0c;他想到一个办法&#xff0c;找关系开后…

Ubuntu20.04之VNC的安装与使用

本教程适用于Ubuntu20.04及以下版本&#xff0c;Ubuntu22.04版本或有出入 更多更新的文章详见我的个人博客&#xff1a;【前往】 文章目录 1.安装图形桌面1.1选择安装gnome桌面1.2选择安装xface桌面 2.安装VNC-Server3.配置VCN-Server4.连接VNC5.设置VNC-Server为系统服务&…

STM32 DMA

DMA介绍 DMA&#xff0c;Direct Memory Access&#xff0c;即直接存储器访问。 DMA传输&#xff0c;将数据从一个地址空间复制到另一个地址空间。&#xff08;内存&#xff08;程序里定义的数组&#xff09;->外设&#xff08;串口、SPI等外设的数据寄存器&#xff09;、外…

web集群学习--静态网页和动态网页的区别、WEB1.0和WEB2.0的区别、Tomcat安装以及部署jpress应用

1.静态网页和动态网页的区别 1.1概念 静态网页&#xff1a; 由在服务器上提前创建好的HTML文件组成&#xff0c;它的内容在用户请求页面时不会发生改变。当用户访问一个静态网页时&#xff0c;服务器会直接将预先准备好的HTML文件发送给用户的浏览器进行显示。因为静态网页的…

iptables防火墙、filter表控制、扩展匹配、使用iptables配置网络型防火墙、NAT原理、配置SNAT

day05 day05iptables防火墙filter表filter中的三条链环境准备iptables操作验证FORWARD链准备环境配置FORWARD链NAT配置SNAT iptables iptables有多种功能&#xff0c;每一种功能都用一张表来实现最常用的功能是防火墙和NAT从RHEL7开始&#xff0c;默认的防火墙为firewalld&a…

Pandas时序数据分析实践—时序数据集

1. 跑步运动为例&#xff0c;对运动进行时序分析 时序数据是指时间序列数据&#xff0c;是按照时间顺序排列的数据集合&#xff0c;每个数据点都与一个特定的时间戳相关联。在跑步活动中&#xff0c;我们可以将每次跑步的数据记录作为一个时序数据样本&#xff0c;每个样本都包…

C语言隐式类型转换规则 (比较实用)

C语言隐式类型转换规则 语言规定&#xff0c;不同类型的数据需要转换成同一类型后才可进行计算&#xff0c;在整型、实型和 字符型数据之间通过类型转换便可以进行混合运算&#xff08;但不是所有类型之间都可以进 行转换) 当混合不同类型的变量进行计算时&#xff0c;便可能会…

网络故障监测终端的网络稳定性和可靠性

RTU5028E网络故障监测终端是一款功能强大且方便实用的设备&#xff0c;集合了断网、断电、网线故障报警功能。它支持同时监测多达7台网络设备&#xff0c;可以帮助用户快速定位远程网络设备离线的原因。此外&#xff0c;它还具备自动重启和远程重启网络设备的功能&#xff0c;为…

P3372 【模板】线段树 1 树状数组

题目 思路 第一眼&#xff1a;树状数组暴力&#xff0c;区间和直接用前缀和做 好&#xff0c;70分 看来需要用数学推亿推了 树状数组的区间查询&#xff1a;查分 设 c 1 a 1 , c 2 a 2 − a 1 , c 3 a 3 − a 2 . . . c i a i − a i − 1 c_1a_1,c_2a_2-a_1,c_3a_3-a_2..…

echart常用图表配置

echart常用图表配置 柱状图3D柱状图效果代码 排行榜柱状图效果代码 排行榜反转柱状图效果代码 柱状图 3D柱状图 效果 代码 import { graphic } from echartsconst VALUE Array.from({ length: 24 }, () > Math.floor(Math.random() * (5000 - 1000)) 1000)const CubeLe…