物理地址

所有的内存单元构成的存储空间是一个一维的线性空间,每一个存储单元在这个空间中都有唯一的地址,这个唯一的地址我们称为物理地址

8086系统CPU中,内存地址是通过16位段地址*16+16位偏移量来确定物理地址

示例:

最后的H十六进制简称

段地址为1000H,那寻址范围为1000H*16 + FFFFH = 10000H1FFFFH

十六进制*16,简单看成16进制左移一位;因为偏移量为16位,因此16进制的最大表示为FFFFH.

逆运算时,段地址和偏移量要除以16

段的概念

内存地址并没有分成段,段的概念来自于CPU.可以将若干连续的内存地址看成是一个段,用段地址*16定位段的起始地址,用偏移地址定位定位段中的内存单元。

  • 段地址*16 段地址必须是16的倍数
  • 偏移地址为16位,一个段的最大址为64KB(2的16次方)

段寄存器

8086系列CPU中,CS为代码段寄存器,IP为指令指针寄存器。CPU任意时刻,会将CS的值*16 + IP的值作为指令执行

所以,通过改变CSIP寄存器的值,可以达到控制CPU执行指令的目的

8086CPU中的段寄存器变化与工作过程简述:

  1. CS:IP指向的内存单元读取指令,读取的指令存入指令缓冲器
  2. IP=IP + 读取到的指令长度,更新IP寄存器,从而指向下一条指令
  3. 执行读取到的指令,继续从1开始新的循环

CSIP寄存器的值不能修改,但可以通过jmp指令来修改后续要执行的内存地址

JMP CS:IP

CS段地址,IP偏移量。转换成实际物理地址为CS*16 + 偏移量

  • 从指定位置读取指令

    jmp 2AE3:3 CS=2AE3 IP=3 执行后的物理地址: 2AE3 * 16 + 3 = 2AE33

  • 将寄存器的IP值修改

    jmp axax中存放的值放入IP寄存器,类似IP=AX

Debug模拟器指令

r 修改/查看寄存器的值

  • r: 查看寄存器中的值

  • r 寄存器名称,如r ax 回车,输入待修改的值

d 查看内存中的内容(十六进制值)

  • d 查看当前内存的内容

  • d CS:IP 查看指定内存的内容,会显示其后的128字节的内容

  • d CS:IP Length 查看指定长度的内容,如d 1000:0 F

e修改内存中的内容

  • e CS:IP 修改指向为为CS:IP内存的值,按空格分隔,回车表示输入完毕

u查看内存中的机器码的含义

  • u 会将内存中的机器码转换成汇编码,即CS:IP指向的值

  • u CS:IP指定内存区间的值

t执行指令