x86处理器编程模型

为x86处理器编写程序的时候, 必须要了解x86的内核寄存器

通用寄存器

Snipaste_2024-12-05_23-01-29

后面才扩充到了32位,又要对以前的代码进行兼容, 所以之前16位结构保留了, BP与SP主要用于对栈空间进行操作, SI和DI用来进行数据的拷贝.

段寄存器

因为早期是16位的模式,只能到65535(64KB的空间),所以后来位数增加以后,就采取了一种,那个16位可以指定要访问的数据的起始地址(段寄存器里面放着), 然后叠加偏移量(16位寄存器存着)

Snipaste_2024-12-05_23-11-05

咱们想访问到0x7c20的位置怎么办

段寄存器给出0x7c0的地址,然后通用寄存器给出32(十进制)这个偏移量,然后由Intel CPU的结构将0x7c0左移4位得到0x7c00(这段为什么多了一层,不用管Intel就是这么设计的), 然后加上32(10进制),就取到0x7c20位置的指令了.

我们没有采样上面这种方式,代码段,数据段,之类的起始地址都不一样, 太麻烦了. 我们采用的是平坦模型我们将代码段, 数据段之类的起始地址都设置成0, 三个寄存器都能访问0到最大64k这样的一个空间,对我们这个设计的这个非常小的OS来说是足够的, 我们就不用考虑CS,DS,SS这些寄存器如何去设置, 我们只需要考虑通用寄存器里面给偏移量就行了,这个偏移量就可以直接等于内存中的地址了

ES,FS,GS用于其他数据段之间的操作,我们这门课并没有用到,所以我们可以不用去管

EIP寄存器

Snipaste_2024-12-05_23-24-14

指示当前程序运行到的位置(就是PC)

EFLAGS寄存器

Snipaste_2024-12-05_23-25-14

Start.S

给几个段寄存器设置成0

_start: // x86使用段寄存器中的内容作为内存访问的基址,因此以下预先设置好mov $0, %ax				// 设置代码段mov %ax, %ds			// 设置数据段mov %ax, %es			// 设置数据段mov %ax, %ss			// 设置栈段mov $_start, %esp		// 设置栈的起始地址jmp .// 跳到引导标志, 由bios在上电后检查.org 0x1fe			// 引导标志.byte 0x55, 0xaa

x86不支持直接将数字给到段寄存器, 先给到某一个通用寄存器

CS寄存器很特殊,不能通过通用寄存器来给地址,我们采用jump指令,

Snipaste_2024-12-05_23-35-45

但是qemu在上电运行启动后, 跳转到我们这个程序之前的话, 它其实会自动将CS赋值为0

接下来调试

Snipaste_2024-12-05_23-38-33

发现CS确实为0,其实下面那一坨寄存器不写,也会是0,只是为了学习需要,就加上赋值的过程

Snipaste_2024-12-05_23-40-53

后面要去运行c代码,所以必须配置这个栈空间

我们打算将这个栈空间设置到0~0x7c00

Snipaste_2024-12-05_23-43-23

设置SP(16位模式下)或者ESP(32位模式下)

将栈空间的最大地址给ESP, 因为X86压栈是高地址往低地址压, 所以我们要设置初始栈空间,就是设置成引导代码的起始位置(橙色部分)

_start:// x86使用段寄存器中的内容作为内存访问的基址,因此以下预先设置好mov $0, %ax				// 设置代码段mov %ax, %ds			// 设置数据段mov %ax, %es			// 设置数据段mov %ax, %ss			// 设置栈段mov $_start, %esp		// 设置栈的起始地址

将0x7c00给到ESP,压栈时候会先将ESP减4, 也就是0x7cEB, 然后再往这个地址压一个数据

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Maven核心概念

Maven 介绍 Maven 官方文档是这样介绍的 Maven 的: Apache Maven is a software project management and comprehension tool. Based on the concept of a project object model (POM), Maven can manage a projects build, reporting and documentation from a ce…

Ubuntu的pip怎么用

第一步:查看python3版本 第二步:安装pip 第三步:可以尝试使用pip list查看 也可以尝试安装 下面这条命令可以设置永久源 pip config set global.index-url https://pypi.tuna.tsinghua.edu.cn/simple

第三十九篇——条件概率和贝叶斯公式:机器翻译是怎么工作的?

目录 一、背景介绍二、思路&方案三、过程1.思维导图2.文章中经典的句子理解3.学习之后对于投资市场的理解4.通过这篇文章结合我知道的东西我能想到什么? 四、总结五、升华 一、背景介绍 数学中的概率,看似和我们的生活没关系,其实它却是…

计算机毕业设计Python轨道交通客流预测分析可视化 智慧交通 机器学习 深度学习 人工智能 爬虫 交通大数据

温馨提示:文末有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:文末有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:文末有 CSDN 平台官方提供的学长联系方式的名片! 作者简介:Java领…

Spring Boot + MySQL 多线程查询与联表查询性能对比分析

Spring Boot MySQL: 多线程查询与联表查询性能对比分析 背景 在现代 Web 应用开发中,数据库性能是影响系统响应时间和用户体验的关键因素之一。随着业务需求的不断增长,单表查询和联表查询的效率问题日益凸显。特别是在 Spring Boot 项目中&#xff0…

Java 初学者的第一个 SpringBoot 系统

Java 初学者的第一个 SpringBoot 系统 对编程初学者而言,都存在一个 “第一个系统” 的问题。有些学习者找不到自己的 “第一个系统”,他们即使再努力也没有办法了解完整的系统,即使他们把教科书里的所有程序都跑通了。但是,面对…

【Vue3】详解Vue3的ref与reactive:两者的区别与使用场景

文章目录 引言Moss前沿AIVue 3响应式系统概述ref与reactive的基础概念ref与reactive的区别1. 数据类型2. 访问方式3. 响应式追踪机制4. 可变性5. 使用场景表格对比 ref与reactive的使用场景1. 选择ref的场景2. 选择reactive的场景 性能分析与优化建议1. 响应式系统的性能优势2.…

【笔记2-3】ESP32 bug:PSRAM chip not found or not supported 没有外部PSRAM问题解决

主要参考b站宸芯IOT老师的视频,记录自己的笔记,老师讲的主要是linux环境,但配置过程实在太多问题,就直接用windows环境了,老师也有讲一些windows的操作,只要代码会写,操作都还好,开发…

itextpdf读取pdf宽高问题

在使用itextpdf读取文档宽高的时候,大多数代码都是这样的: Rectangle page reader.getPageSize(pageNum); float width page.getWidth(); float height page.getHeight(); int rotation page.getRotation();这样读取的,对于标准pdf如A4等…

【nodejs】puppeteer在window下因参数scale导致重复截图问题解决

在线地址:https://textcard.shushiai.com/zh 最近构建流光卡片免费 markdown 文本转精美图片 api 的时候遇见了一个问题 👇(API 尚未公开,还在小部分内测,测试,尝试修复 bug 中) 我发现在我 w…

3、.Net UI库:MaterialSkin - 开源项目研究文章

MaterialSkin 是一个开源的 WinForms 第三方库,提供了许多仿谷歌设计风格的组件,使得 WinForms 窗体程序更加美观。以下是 MaterialSkin 的一些关键特点和使用方法: 主要特点: 仿谷歌设计风格:MaterialSkin 提供了大量…

VMware安装windows2003

一、安装vm 这一项大家应该都会,网上也有很多教程。 二、搭建Windows server 2003 1、镜像下载- 2、虚拟机安装 首先是新建虚拟机,我选的是自定义,也可以选典型 第一步默认下一步,也可以是自己的情况做修改 第二步选择稍后安…

51c自动驾驶~合集11

我自己的原文哦~ https://blog.51cto.com/whaosoft/12684932 #如何在自动驾驶的视觉感知中检测corner cases? 一篇来自德国大学的论文:“Corner Cases for Visual Perception in Automated Driving: Some Guidance on Detection Approaches“&#xf…

四、自然语言处理_02RNN基础知识笔记

1、RNN的定义 RNN(Recurrent Neural Network,循环神经网络)是一种专门用于处理序列数据的神经网络架构,它与传统的前馈神经网络(Feedforward Neural Network)不同,主要区别在于它能够处理输入数…

梯度提升树(GBDT)与房价预测案例

文章目录 什么是梯度提升树(GBDT)?核心思想GBDT 的特点 梯度提升树的应用案例:房价预测场景描述步骤详解代码详情 详细代码讲解1. 导入必要的库2. 设置中文字体支持3. 可视化真实值与预测值4. 可视化预测误差分布5. 代码的运行效果…

Rust : 生成日历管理markdown文件的小工具

需求: 拟生成以下markdown管理小工具,这也是我日常工作日程表。 可以输入任意时间段,运行后就可以生成以上的markdown文件。 一、toml [package] name "rust-workfile" version "0.1.0" edition "2021"[d…

Linux网络:代理 穿透 打洞

Linux网络:代理 & 穿透 代理正向代理反向代理 内网穿透frp 内网打洞 代理 正向代理 正向代理是一种常见的网络代理方式,它位于客户端与目标服务器之间,代表客户端向服务器发送请求,接收响应。 如图,客户端发送的…

给el-table表头添加icon图标,以及鼠标移入icon时显示el-tooltip提示内容

在你的代码中,你已经正确地使用了 el-tooltip 组件来实现鼠标划过加号时显示提示信息。el-tooltip 组件的 content 属性设置了提示信息的内容,placement 属性设置了提示信息的位置。 你需要确保 el-tooltip 组件的 content 属性和 placement 属性设置正…

游戏引擎学习第30天

仓库: https://gitee.com/mrxiao_com/2d_game 回顾 在这段讨论中,重点是对开发过程中出现的游戏代码进行梳理和进一步优化的过程。 工作回顾:在第30天,回顾了前一天的工作,并提到今天的任务是继续从第29天的代码开始&#xff0c…

python使用python-docx处理word

文章目录 一、python-docx简介二、基本使用1、新建与保存word2、写入Word(1)打开文档(2)添加标题(3)添加段落(4)添加文字块(5)添加图片(6&#xf…