曲曲的秘密学术基地

纯化欲望、坚持严肃性

欢迎!我是曲泽慧(@zququ),目前在深圳(ICBI,BCBDI,SIAT)任职助理研究员。


病毒学、免疫学及结构生物学背景,可以在 RG 上找到我已发表的论文

本站自2019年7月已访问web counter

汇编语言 2.9 2.10 2.11 2.12 段寄存器,CS IP,代码段

2.9 段寄存器

8086CPU在访问内存时,要由相关部件提供内存单元的段地址和偏移地址,送入加法器合成物理地址。

8086CPU中有四个段寄存器:

CS, DS, SS, ES

2.10 CS 和 IP

CS和IP是8086CPU中两个最关键的寄存器。

CS为代码段寄存器, IP为指令指针寄存器(偏移地址寄存器)。

8086机中,任意时刻,CPU将CS:IP指向的内容当做指令执行。

过程如下:

  1. 从CS:IP指向的内存单元读取指令,读取的指令进入指令缓冲器;
  2. IP=IP+所读取指令的长度,从而指向下一条指令;
  3. 执行指令。 转到步骤1, 重复这个过程。

在8086CPU启动或者复位后,CS和IP被设置为CS=FFFFH,IP=0000H,即刚开机时,CPU从内存FFFF0H单元中读取指令执行,FFFF0H单元中的指令是8086PC机开机后执行的第一条指令。

因为在任何时候,CPU将CS,IP中的内容当做指令的段地址和偏移地址,用他们合成指令的物理地址,到内存中读取指令码,执行。如果说,内存中的一段信息曾被CPU执行过,那么,他所在的内存单元必定会被CS:IP指向过。

2.11 修改CS、IP的指令

在CPU中程序员只能用指令读写的部件只有寄存器, 可以通过改变寄存器中的内容实现对CPU的控制。CPU从何处执行指令是由CS、IP中的内容决定的,程序员可以通过改变CS、IP中的内容来控制CPU执行目标指令。

  1. mov指令,被称为传送指令
  2. jmp指令,能够改变CS、IP的内容的指令被统称为转移指令,jmp是最简单的。

例如,

jmp 2AE3:3, 执行后: CS=2AE3H, IP=0003H,CPU将从2AE33H处读取指令

jmp 段地址:偏移地址(合法寄存器): 用寄存器中的值修改IP

jmp 还要另外一个用法:

例如

jmp ax 含义为类似于: mov IP, ax

2.12 代码段

mov ax, 0000 (B80 00 00)
add ax, 0123H (05 23 01)
mov bx, ax (8B D8)
jmp bx (FF E3)

这里共有10个字节(复习:两个16进制位可以表示一个字节(=8bit))

CPU只认识被CS:IP指向的内存单元中的内容为指令。所以,要让CPU执行我们放在代码段中的指令,必须要将CS:IP指向所定义的代码段中的第一条指令的首地址(代码示例的第一行)。

Last One

汇编语言 Debug的用法

什么是DebugDebug是DOS、Windows都提供的实模式(8086方式)程序的调试工具。使用它,可以查看CPU各种寄存器中的内容、内存的情况和在及其码级跟踪程序的运行。Debug的使用 R命令查看、改变CPU寄存器的内容; D命令查看内存中的内容; E命令改写内存中的内容; U命令将内存中的机器指令翻译成汇编指令; T命令执行一条机器指令; A命令以汇编指令的格式在内存中写入一条及其指令。指令详解 R命令:-rAX=0000 BX=0000 CX=0000 DX...…

汇编语言More
Next One

汇编语言 2.8 段的概念

2.8 段的概念段只是我们主观认为的,CPU在识别内存时都只认识一整条段!在编程时可以根据需要,将若干地址的内存单元看做一个段,用段地址x16必然是16的倍数,所以一个段的起始地址也一定是16的倍数;偏移地址为16位,16位寻址能力为64KB,所以一个段的长度最大值为64KB。CPU可以用不同的段地址和偏移地址形成同一个物理地址。偏移地址为16位,变化范围为0~FFFFH, 仅用偏移地址来寻址最多可寻64KB个内存单元。可以根据需要,将地址连续、起始地址为16的倍数的一组内存单元定义为一个段。…

汇编语言More