手写X86——第四节——X86实模式下的编程介绍(各种寄存器)

🌈hello,你好鸭,我是Ethan,西安电子科技大学大三在读,很高兴你能来阅读。

✔️目前博客主要更新Java系列、项目案例、计算机必学四件套等。
🏃人生之义,在于追求,不在成败,勤通大道。加油呀!

🔥个人主页:Ethan Yankang
🔥推荐:史上最强八股文||一分钟看完我的几百篇博客

🔥温馨提示:划到文末发现专栏彩蛋   点击这里直接传送

🔥本篇概览:详细讲解了手写X86——第四节——X86实模式下的编程介绍(各种寄存器)。🌈⭕🔥


【计算机领域一切迷惑的源头都是基本概念的模糊,算法除外】


🔥 手写底层系列

🔥 手写X86系列


🌈章节引出

前一篇章:

🌈章节速览


一、X86实模式下的编程模型

1.通用寄存器

通用寄存器

可以进行8、16、32位访问,(由于intel的历史遗留问题,向下兼容)

  1. AX(Accumulator Register,累加寄存器)

    • 主要用于算术和逻辑运算操作,如加法、减法、乘法和除法等。在一些指令中,它还可以作为源操作数和目的操作数。
    • 例如,在乘法指令中,AX 通常用于存储乘积的低 16 位。
  2. BX(Base Register,基址寄存器)

    • 常作为存储器地址指针,在内存寻址中可以用于存储基地址。
    • 例如,在一些指令中可以与位移量一起构成内存地址,用于访问数据。
  3. CX(Count Register,计数寄存器)

    • 常用于循环操作,作为循环计数器。
    • 在字符串操作指令和循环指令中,CX 通常存储循环次数或字符串长度等信息。
  4. DX(Data Register,数据寄存器)

    • 与 AX 一起在某些乘法和除法指令中使用,用于存储乘积的高 16 位或除法操作的余数等。
    • 在进行 I/O 操作时,DX 也可用于指定端口地址

指针和变址寄存器

  1. BP(Base Pointer,基址指针寄存器)

    • 主要用于访问堆栈中的数据,作为栈帧的基指针,指向当前栈帧中的一个固定位置。
    • 在访问局部变量和参数时经常用到。
  2. SI(Source Index,源变址寄存器) 和 DI(Destination Index,目的变址寄存器)

    • 常用于字符串操作指令中,分别作为源字符串和目的字符串的索引指针。
    • 在内存寻址中也可以与其他寄存器一起使用,构成复杂的地址计算。

堆栈指针寄存器

  1. SP(Stack Pointer,堆栈指针寄存器)
    • 始终指向当前堆栈的顶部,用于管理堆栈的入栈和出栈操作
    • 随着数据的压入和弹出,SP 的值会相应地增加或减少。


2.段寄存器

        段寄存器要追溯到早期的英特尔CPU,它是16位的编程模式,早期的话他这些寄存器都是16位的。所以的话只能够访问0~65535(64K)的一块空间。所以如果要用如果这些寄存器里面放相应的地址去访问内存的话,他只能访问这个64K的空间,64k空间的话是比较小的。我们实际的这个内存肯定不止64K,所以他这里就采取了一种方式:段寄存器+起始地址。可以指定一下我们要访问的这个数据它的这个起始地址然后以这个起始地址为基础,然后叠加相应的这个16位寄存器进行访问。
    

代码段:


        那这个起始地址的话就是由段寄存器去指定的。段寄存器我们可以给它指定一个值,比如说我们代码这里有一块比较大的空间,是64K。然后的话我们要去访问他的话,就需要给定这个cs一个值,那这个值的基地址比方说是0x7C00,然后之后的话我们如果说要访问这个代码段偏离量是32也就是0x7C32这个地址处的代码时候,我们只需要将这个cs(code segment)给到0x7C00,然后的话再将这个偏移量设置为32,就可以访问到了。
计算时,会将段寄存器向左偏移4位,然后与偏移量相加。这里的左移4位是Intel当初自己的设计。
让我们看一下这个数据段这一块
    

数据段:


        如果我们访问内存中相应的变量进行读写的时候,一般就是会使用到这个DS寄存器(data segment的缩写)然后数据段会给它一个起始地址。比方说要访问的是0X3044,那就会将这个数据段说设置成0x3000,然后再加上相应的偏移量44,在这里读取数据。


本课实际使用时:

        段寄存器这一块就是比较复杂的。我们如果要访问内存中的一些代码或者是数据的话,我们必须要将相应的这个段寄存器进行设置,然后以段寄存器中指定的这个基地址,然后再加上偏移量,去访问。这个是比较麻烦的。 

        所以我们采用的是非常简单的方式 我们将段寄存器的值都设置成零。 也就是说我们只访问0~最大64K这样的一个空间。这个空间,实际上对我们来说是完全足够的。对于这样的小操作系统并不需要考虑这个CS、DS里面的寄存器如何去设置。


        也就是说:将偏移量设置成真实地址,段寄存器统统为0,就不做左移之类的了


举个栗子:

比方说我们要访问这个内存中0x3044处的变量,我们可以直接将这个DS设置成零,然后的话我们可以给定一个偏移量,偏移量的话放在这个ax寄存器里面,直接设置成0X3044,这个跟内存中的地址是一样的。那么就可以通过这个地址去访问它。

至于后面的ES、FS、GS都是与数据段操作有关的,不影响程序。


3.IP寄存器、PSW寄存器

IP寄存器,或者说EIP,它本来是32位的,如果是在16位的模式下的话是只用到16位。它就指定了我们当前的这个程序运行到的位置是哪里。
PSW寄存器,全称程序状态与控制寄存器。这个在所有其他的这个处理器上都有的一个非常重要的寄存器指定了我们程序上一条指令的这个运行状态比如说有没有溢出、奇偶标志等等的一些东西,这些标志位我们在这门课程中,并不需要对它进行任何的这个设置,只需要了解到有这样的一个寄存器存在就可以。

4.本课程采用模型

将各种段寄存器设置为0,进行编程。这种模式也叫平坦模型。

 所以本课程使用的模型是x86的实模式下的平坦模型编程



💖💖💖💖💖💖💖💖💖💖💖💖💖💖💖💖💖💖

热门专栏推荐

🌈🌈计算机科学入门系列                     关注走一波💕💕

🌈🌈CSAPP深入理解计算机原理        关注走一波💕💕

🌈🌈微服务项目之黑马头条                 关注走一波💕💕

🌈🌈redis深度项目之黑马点评            关注走一波💕💕

🌈🌈JAVA面试八股文系列专栏           关注走一波💕💕

🌈🌈JAVA基础试题集精讲                  关注走一波💕💕   

🌈🌈代码随想录精讲200题                  关注走一波💕💕


总栏

🌈🌈JAVA基础要夯牢                         关注走一波💕💕  

🌈🌈​​​​​​JAVA后端技术栈                          关注走一波💕💕  

🌈🌈JAVA面试八股文​​​​​​                          关注走一波💕💕  

🌈🌈JAVA项目(含源码深度剖析)    关注走一波💕💕  

🌈🌈计算机四件套                               关注走一波💕💕  

🌈🌈数据结构与算法                           ​关注走一波💕💕  

🌈🌈必知必会工具集                           关注走一波💕💕

🌈🌈书籍网课笔记汇总                       关注走一波💕💕         



📣非常感谢你阅读到这里,如果这篇文章对你有帮助,希望能留下你的点赞👍 关注❤收藏✅ 评论💬,大佬三连必回哦!thanks!!!
📚愿大家都能学有所得,功不唐捐!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值