Linux源码学习笔记day2 怎么复制到0x90000?
上次我们学习到开机后会修改段寄存器ds为 0x07c0,方便之后利用这个段基址进行内存寻址。
这次我们主要学习以下几行代码:
.equ INITSEG, 0x9000
mov $INITSEG, %ax #将es段寄存器设置为0x900
mov %ax, %es
mov $256, %cx
sub %si, %si
sub %di, %di
rep
movsw
第一行先 定义常量INITSEG 为0x9000。
然后取出INITSEG的值 给到通用寄存器ax。
接着把ax给到了 段寄存器es。这时候es里的值就是0x9000了。
然后把立即数 256 给到了 通用寄存器 cx(一般cx 用作计数器)。
接下来2个 sub 指令,就是把 si 和 di都清零了。
现在ds, es, cx, si, di都有值了。
ds = 0x07c0
es = 0x9000
cx = 256
si = 0
di = 0
关键寄存器就变成了这样。
接下来的指令:
rep movsw
这里rep 是重复的意思,movsw是复制一个字。就是不断地复制一个字。
这里扩展一下:
- 一个字节是8位
- 一个字是16位
MOVS 是串指令里的串传送:
- MOVSB 传送字符
- MOVSW 传送字.
- MOVSD 传送双字
一般来说 cx里有值,就意味要有循环了。
循环的次数:就是cx的值256。退出条件就是cx == 0
从哪儿复制到哪儿:从ds:si 复制到es:di,也就是0x7c00 复制到0x90000。
一次复制2个字节,复制256次 正好是复制了512个字节!也就是说将内存地址 0x7c00 处开始往后的 512 字节的数据,复制到 0x90000 处开始的后面 512 字节的地方
也就是这里的第二步:
接下来是一个跳转指令:
ljmp $INITSEG, $go #段间跳转,这里INITSEG指出跳转到的段地址,解释了cs的值为0x9000
go: mov %cs, %ax #将ds,es,ss都设置成移动后代码所在的段处(0x9000)
mov %ax, %ds
作者那里是8086的指令里是jmpi,我看的这个是AT&T指令,这里是ljmp。
反正意思都是段间跳转。这里由于INITSEG是0x9000 所以就是要跳转到0x9000:go的地址。段基址要左移4位,所以最后要跳转到0x90000 + go的内存地址。
这个go: 在这里是一个标签(label),编译成机器码的时候会变成一个值,就是段内偏移地址。
这时候,假设偏移量是0x10,其实就是这一行代码
mov %cs, %ax
所在的内存地址就是 0x90000 + 0x10 = 0x90010 CPU最终就会跳转到0x90010处。
下一次,我们一起看看go里面又发生了哪些”精彩“?
相关文章
- 【Linux 内核】编译 Linux 内核 ② ( 解压内核源码 | 查询当前 Linux 内核版本号 | 进入并查看 linux 内核源码目录 )
- Linux下探索代码的奥秘(linux查看代码)
- Linux源码下载:一步步搞定(linux源码怎么下载)
- 修改Linux内核:探究其神奇魅力(linux源码修改)
- Linux 双机热备:保障系统安全可靠运行(linux双机热备方案)
- 深入Linux 源码:剖析核心技术(linux源码剖析)
- Linux内核源码注释:深入剖析源代码示例(linux内核源码注释)
- Linux内核源码之旅:一次全面、深度的导读(linux内核源码导读)
- Linux限制端口流量控制策略(linux限制端口流量)
- 学习Linux串口编程:深入理解源码(linux串口源码)
- 文件Linux下查看隐藏文件的方法(linux显示隐藏)
- Linux网卡性能优化实践(linux网卡优化)
- 巧妙卸载Linux 源码包的小技巧(linux卸载源码包)
- 命令Linux下cd ..实现返回上级命令(linux返回上级)
- 安装Linux系统:无线网卡驱动安装指南(linux系统无线网卡驱动)
- Linux 内核源码分析:探索世界的奥秘(linux内核源码分析)
- 轻松访问Linux系统:远程桌面Win连接LINUX(win远程linux)
- Linux下查看文件的绝对路径(linux查看绝对路径)
- 深入探索Linux串口设置(linux设置串口)
- Linux防火墙iptables学习笔记(五)linux+iptables构筑防火墙实例
- 轻松学习:如何查看 Linux 源码详细指南(如何查看linux源码)
- 深入探索Linux服务器源码,解密开放软件的奥秘(linux服务器源码)
- 让有道云笔记开启Linux之旅(有道云笔记linux)
- Linux用户名更改:解锁潜在可能性(更改linux用户名命令)
- 结构探索Linux内核源码的神秘目录结构(linux内核源码目录)
- 保护你的数据安全:使用Linux系统加密狗(linux系统加密狗)
- 兄弟连Linux笔记:分享学习经验,帮助菜鸟入门!(兄弟连linux笔记)
- 深度开源:Linux内核源码在线访问!(linux内核源码在线)
- 深入Linux内核-源码解析与下载(linux内核源码 下载)
- Linux 下的云笔记:让文字信息存储变得更加便捷!(云笔记linux)
- Linux编译源码:改变世界的新姿势(linux编译源码)