交流
商城
MCN
登入
注册
首页
提问
分享
讨论
建议
公告
动态
发表新帖
发表新帖
5 实模式下寻址
分享
未结
0
2683
李延
LV6
2022-06-24
悬赏:20积分
# 1 疑问 我们在虚拟机中debug 我们的代码,并反编译我们的代码。 首先在0x7c00处打断点,并运行到断点处 ```shell b 0x7c00 c ``` 我们反编译一下我们的代码, ```shell u switch-mode u 0x7c00 0x7c20 ``` 我们得到如下内容:  这里我们主要关注的是0x07c11处代码,也就是我们代码对应的`mov $msg1, %bp`. 我们可以很明显的看到$msg1 被翻译为了0x0019这个地址。 我们想要打印的字符是在文件的第0x0019处没有问题什么问题,但我们知道我们的代码会被加载到内存0x07c00处。也就是我们需要打印的字符串,现在应该在内存的 0x7c00+0x0019 这个位置,而不是0x0019处。 那么这个偏移的地址 0x7c00 又是在哪里计算出来的,这个就是我们本章需要讨论的问题。 # 2 实模式 对于实模式介绍,可以自己查找资料了解,或者如下链接 https://www.bilibili.com/video/BV1AT4y1N71D/?spm_id_from=333.788&vd_source=153b91b97e6c995e4a596387b8d84465 我们主要将以不同示例解释实模式的寻址方式 # 3 实模式寻址方式 前面我们分析知道,实模式下寻址 ,是段寄存器左移4位后再加上偏移地址,这样就可以通过16位寄存器找到20位的地址。 我们通过下面这个例子进行验证,有如下代码: ```asm .code16 .global _start .equ BOOTSEG, 0x07c0 .equ BOOTSEG2, 0x07c1 .equ BOOTSEG3, 0x07c2 _start: mov $BOOTSEG, %ax mov %ax, %es mov %es:msg1, %bx mov $BOOTSEG2, %ax mov %ax, %es mov %es:msg1, %cx mov $BOOTSEG3, %ax mov %ax, %es mov %es:msg1, %dx mov (%bp),%ax int $0x10 msg1: .string "Hello, World!" msg2: .string "Hello, World!" msg3: .string "Hello, World!" .org 510 boot_flag: .word 0xAA55 ``` 这里我们通过`mov %es:msg1, %dx` 在给bx,cx,dx寄存器赋值时都使用了es段寄存器,不同的是每次都改变了es的值,每次增加1。 我们再通过debug查看这几个寄存器的值  我们看到他们分别为 - bx 0x6548 - cx 0x6c6c - dx 0x2c6f 我们打开我们的代码查看它的二进制  我们发现它们每个值之间刚好相差16个字节。复合我们的理论。 # 4 段寄存器 上面我们使用了es这个段寄存器作为段地址,除了es外还有3个,它们分别是 - ss 堆栈段寄存器 - es 扩展段寄存器 - ds 数据段寄存器 - cs 代码段寄存器 那么它们有什么不同之处,我们依次介绍。 ## 4.1 实模式下可寻址的寄存器 我们在32位时,共有8个通用寄存器,但这些寄存器在16位的实模式下,只有4个可用做内存寻址,它们分别是: - bx - bp - si - di 而其他的4个无法用做寻址,我们通过示例进行验证,编写如下汇编: ```asm .code16 .global _start _start: mov (%ax), %ax mov (%bx), %ax mov (%cx), %ax mov (%dx), %ax mov (%si), %ax mov (%di), %ax mov (%bp), %ax mov (%sp), %ax .org 510 boot_flag: .word 0xAA55 ``` 我们用这8个都进行寻址操作,在编译时会报错如下: ```sh bootsect.s: Assembler messages: bootsect.s:5: Error: `(%ax)' is not a valid base/index expression bootsect.s:7: Error: `(%cx)' is not a valid base/index expression bootsect.s:8: Error: operand type mismatch for `mov' bootsect.s:12: Error: `(%sp)' is not a valid base/index expression ``` 我们发现有4行会报错,就是我们之前说的不可寻址的寄存器。 ## 4.2 可寻址寄存器分别对应的段寄存器 我们之前介绍了4个段寄存器,其中cs是关键程序记数器的寻址,我们先忽略,其他3个分别在与4个可寻址的寄存器对应,在这4个可寻址的寄存器进行寻址时,分别会加上这几个段寄存器。具体情况如下: ## 4.2.1 mov操作 当使用mov操作时,4个寄存器分别会使用如下段寄存器: - bx -->ds - si -->ds - di -->ds - bp --> ss # 4.2.2 movsb movsb操作时,两个寄存器分别使用: - si --ds - di -- es 目前只知道这些,如果还有其他情况,具体补充。 ## 4.3 CS cs 与IP寄存器配合使用
回帖
消灭零回复
提交回复
热议榜
java 相关知识分享
8
好的程序员与不好的程序员
6
写给工程师的十条精进原则
5
spring boot以jar包运行配置的logback日志文件没生成
5
一步一步分析SpringBoot启动源码(一)
5
MockMvc测试
5
【吐槽向】是不是有个吐槽的板块比较好玩
4
logstash jdbc同步mysql多表数据到elasticsearch
3
IntelliJ IDEA 优质License Server
3
.gitignore忽略规则
3
SpringBoot启动源码分析
3
一步一步分析SpringBoot启动源码(三)
3
2
一步一步分析SpringBoot启动源码(二)
2
积分不够将无法发表新帖
2
官方产品
Meta-Boot - 基于MCN
MCN - 快速构建SpringBoot应用
微信扫码关注公众号