数据段DS+偏移地址段BX
数据段可以通俗理解为数据容器指针
比如:
代码语言:javascript复制MOV AX 0220H
MOV DS AX
MOV BX 0
MOV AX [BX]
;我们发现 DS数据段一直都是在给不同地址的容器赋值
代码段CS 偏移地址段IP
代码段可以通俗理解为汇编代码指针
比如:
代码从 MOV AX 0220H
开始,那么代码段指向这行代码地址, 如果想要跳过这行代码的执行,那么进行代码段偏移
在通过debug模式配合-u指令查看汇编代码时,可以根据CS进行范围查看:
比如:
代码语言:javascript复制#以下模拟控制台输出
-r
AX=0000 BX=0000.....
DS=13DB ES=13DB SS=13EB CS=13EB IP=0000
-u 13eb:0
13BE:0000 B8FFFF MOV AX,FFFF
栈段SS 偏移地址段SP
栈段可以通俗理解为栈指针
什么是段
首先内存并没有分段,段的划分来自CPU,来自我们自己对内存的操作。由8086CPU
代码语言:javascript复制(段地址 偏移地址=“物理地址”)
的方式给出内存单元的物理地址,使得我们用分段的方式管理内存
可以将段通俗理解为小区的一栋楼,偏移地址为这栋楼的住户门牌号.比如五号楼101房,那么形象比喻:
代码语言:javascript复制五号楼---->段地址 101房---->偏移地址
为什么要这样划分?
直接使用一个物理地址岂不是更简单,何必拆分成段地址 物理地址?
这是由于8086cpu16位寄存器局限性造成的, 由于16位的寄存器最大只能存放0xFFFF 如果存放超过五位的地址比如0xFFFFA 则无法存放, 为了解决这个问题, cup设计者想出了 段地址*16 偏移地址的方法完美解决这个问题
物理地址=段地址*16 偏移地址
一个物理地址可以有四种写法, 比如0xFFFFA:
代码语言:javascript复制0xFFFFA=0xFFFF0*16 0x000A
0xFFFFA=0xFFF00*16 0x00FA
0xFFFFA=0xFF000*16 0x0FFA
0xFFFFA=0xF0000*16 0xFFFA
段的赋值
代码段CS 数据段DS 栈段SS 不能直接赋值, 必须通过通用寄存器中转赋值
偏移地址可以直接赋值
代码语言:javascript复制mov ax ,2000H
mov ss ,ax
mov sp ,10H