逆向基础--汇编基础(CS与IP) (05)

一. 段地址

  段表示某个范围 / 区间,可以理解为一段地址。更规范的说法是一块地址连续且起始地址为16倍数的存储单元定义为一个段。  

  之所以是16倍数是因为:物理地址=段地址 * 16 +偏移地址

  假设有两个段:10000H ~ 1007FH (段地址为1000H)、10080H ~ 100FFH,段地址为(1008H)。这两个段大小均为80H。-----段地址1000H和1008H,它们之间有什么关系?注意1000H * 10H = 10000H,1008H * 10H = 10080H。所以第二个段起始于10080H,正好是第一个段结束后的下一个字节,第一个段结束于1007FH,1007FH + 1 = 10080H,所以是的,两个段是连续。的。注意10H就是16D

  这段我们在编程时就可以根据需要将一块地址连续的存储单元看成一个段,通过 物理地址=段地址 * 16+ 偏移地址 来定位段中的内存。

  注意:段地址一定是16的倍数,且段的最大长度为64kb。具体一个段使用多大的长度,是由程序来定义的,上面段的长度为80H (128 字节)

  在x86架构中,段地址和偏移地址一起形成物理地址。物理地址的计算是段地址乘以16(或左移4位)加上偏移地址。

  段地址的根本作用是:扩展寻址空间,因为早期CPU8086的寄存器是16位的,如果直接使用,只能寻址 2^16 = 64KB 的内存,这远远不够。所以段地址 × 16 + 偏移地址就使CPU的寻址能力从64KB提升到了 2^20 = 1MB。

  段地址的核心功能是:组织和隔离内存,段地址为程序提供了一种逻辑上的内存划分方式,使得内存管理更加有序( CS, DS,SS, ES)。

  段地址是由CPU的相关部件提供,大多寄存器中有4个段寄存器: CS, DS,SS, ES。当CPU要访问内存时,由他们提供段地址,通过分段来管理内存

    ---CS (Code Segment):代码段,存放当前正在执行的指令。

    ---DS (Data Segment):数据段,存放程序的主要数据。

    ---SS (Stack Segment):堆栈段,存放堆栈数据。

    ---ES (Extra Segment):附加段,通常用作数据操作的备用段。

二. CS与IP

  CS与IP是8086CPU中最关键的两个寄存器。它们指示CPU当前要读取的指令的地址。 CS称之为代码段寄存器,IP为指令指针寄存器。

  在8086CPU中,任意时刻设CS中的值为M,IP中的值为N,则CPU将从 M *16 +N地址单元中取出一条指令并执行。也就是说当前指令在哪由CS和IP来决定,表示为CS:IP,下图为CPU通过CS、IP寄存器进行指令操作

  上图说明如下:

    1)CS的内容为2000H,IP内容为0000H, 说明物料地址为20000H(2000H *10H=20000H 或者2000H * 16=20000H),20000H去寻址对应内存为B8H,通过指令计数器把B8 23 01通过数据总线送到指令缓冲器中,再执行控制器(对应的汇编指令 mov ax,0123H)。

    2)内存20000H ~ 20009H内存单元中存放着可执行的机器码

   那么上述的状态下程序又是如何执行的呢?

    1)CPU从CS:IP指向的存储单元中读取指令,读取的指令进入指令缓冲区。

    2)IP=IP + 所读取指令的长度,从而指向下一条指令。 如下一次IP为0003H, 通过地址加法器组成20003H再去寻址对应内存为BBH

    3)执行指令。重复1、2步

  总结:

    1)CS(Code Segment,代码段寄存器):

        --- 用于存放当前代码段的段地址。

        --- 代码段是内存中存储程序指令的区域。

        --- 段地址是20位物理地址的高16位,实际物理地址由CS左移4位(相当于乘以16)加上IP的值得到。

    2)IP(Instruction Pointer,指令指针寄存器):

        --- 用于存放下一条要执行的指令在代码段内的偏移地址。

        --- 它总是与CS寄存器一起使用,形成20位的物理地址,即:物理地址 = (CS << 4) + IP。

        --- 当CPU执行一条指令后,IP会自动增加,指向下一条指令。增加的大小取决于已执行指令的长度。

   上面讲到了CS段用途是取指令,默认的偏移地址是IP。而其它三个段寄存器不再这里介绍: DS段用途是访问数据,SS段用途是堆栈操作,ES段用途是串操作目标, 它们的默认的偏移地址都不同。

相关推荐
LabVIEW开发9 分钟前
使用 LabVIEW 获取文件的创建日期:从内置函数到 Windows API 封装
网络·windows·labview·labview知识·labview功能·labview程序
DevOpenClub15 分钟前
全球区域与 IP 定位工作台案例方案
大数据·网络·网络协议·tcp/ip
wuyk55517 分钟前
从零吃透 Modbus 通信|第 6 章:线圈功能码 05/0F 实现 & Modbus‑TCP 基础入门
c语言·网络·网络协议·tcp/ip
NJCloud1 小时前
Docker 私有仓库部署:Registry、加密传输与认证鉴权
运维·网络·docker·云原生·容器
CC城子1 小时前
Bootloader + OTA -Ymodem 协议
网络·ymoden
又见情义1 小时前
RK3568 + RTL8211F 网络唤醒(WOL)功能适配全记录
android·网络·驱动开发
Titan20241 小时前
HTTPS基础知识梳理
服务器·网络·c++·网络协议·学习·http·https
自然石人2 小时前
石都随笔:深耕不张扬,平凡自有千钧力
网络·经验分享·百度·传媒·新浪微博
新时代牛马2 小时前
epoll 源码路径:从epoll_ctl 到ep_poll 的就绪唤醒
网络·数据库·网络协议
简单Janeee2 小时前
[Vue 3 从零到上线]-第九篇:更美更强——引入 UI 库与网络请求 (Axios)
网络·vue.js·ui