汇编语言之数据段和代码段以及栈段的理解

数据段DS+偏移地址段BX

数据段可以通俗理解为数据容器指针

比如:

1
2
3
4
5
MOV AX 0220H
MOV DS AX
MOV BX 0
MOV AX [BX]
;我们发现 DS数据段一直都是在给不同地址的容器赋值

代码段CS+偏移地址段IP

代码段可以通俗理解为汇编代码指针

比如:

代码从 MOV AX 0220H 开始,那么代码段指向这行代码地址, 如果想要跳过这行代码的执行,那么进行代码段偏移

在通过debug模式配合-u指令查看汇编代码时,可以根据CS进行范围查看:

比如:

1
2
3
4
5
6
#以下模拟控制台输出
-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

1
(段地址+偏移地址=“物理地址”)

的方式给出内存单元的物理地址,使得我们用分段的方式管理内存

可以将段通俗理解为小区的一栋楼,偏移地址为这栋楼的住户门牌号.比如五号楼101房,那么形象比喻:

1
五号楼---->段地址  101房---->偏移地址

为什么要这样划分?

直接使用一个物理地址岂不是更简单,何必拆分成段地址+物理地址?

这是由于8086cpu16位寄存器局限性造成的, 由于16位的寄存器最大只能存放0xFFFF 如果存放超过五位的地址比如0xFFFFA 则无法存放, 为了解决这个问题, cup设计者想出了 段地址*16+偏移地址的方法完美解决这个问题

物理地址=段地址*16+偏移地址

一个物理地址可以有四种写法, 比如0xFFFFA:

1
2
3
4
5
6
7
0xFFFFA=0xFFFF0*16+0x000A

0xFFFFA=0xFFF00*16+0x00FA

0xFFFFA=0xFF000*16+0x0FFA

0xFFFFA=0xF0000*16+0xFFFA

段的赋值

代码段CS 数据段DS 栈段SS 不能直接赋值, 必须通过通用寄存器中转赋值

偏移地址可以直接赋值

1
2
3
mov ax ,2000H
mov ss ,ax
mov sp ,10H

本文为作者原创 转载时请注明出处 谢谢

乱码三千 – 点滴积累 ,欢迎来到乱码三千技术博客站

0%