0305 关于段的总结

各种段

基础:物理地址=段地址×16+偏移地址

做法

  • 编程时,可以根据需要将一组内存单元定义为一个段。
  • 可以将起始地址为16的倍数,长度为N(N ≤64K )的一组地址连续的内存
    单元,定义为一个段。
  • 将一段内存定义为一个段,用一个段地址指示段,用偏移地址访问段内的单元——在程序中可以完全由程序员安排

三种段

数据段

将段地址放在 DS中

用mov、add、sub等访问内存单元的指令时,CPU将我们定义的数据段中的内容当作数据段来访问

代码段

将段地址放在 CS中,将段中第一条指令的偏移地址放在IP中

CPU将执行我们定义的代码段中的指令 ,即当做指令来使用

栈段

将段地址放在SS中,将栈顶单元的偏移地置放在 SP 中

CPU在需要进行栈操作(push、pop)时,就将我们定义的栈段当作栈空间来用

综合示例:按要求设置栈段并执行代码

image-20230903222925694

代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
/*标识数据段*/
mov bx, 1000H
mov ds, bx
/*标识栈段*/
mov bx, 1001H
mov ss, bx
mov sp, 10H ;可知栈顶地址为10020H
/*代码段*/
mov ax, [0] ;读取10000H处数据1123H到ax,ax=1123H
mov bx, [2] ;读取10002H处数据0022H到bx,bx=0022H
push ax ;压栈:ax数据1123H压入1001EH~1001FH处,栈顶地址1001EH
push bx ;压栈:bx数据0022H压入1001CH~1001DH处,栈顶地址1001CH
pop ax ;出栈:1001CH~1001DH处读取到ax,栈顶地址1001EH,ax=0022H
pop bx ;出栈:1001EH~1001FH处读取到ax,栈顶地址10020H,bx=1123H
mov [0], ax ;ax数据写入到10000H处,10000H处数据变为0022H
mov [2], bx ;bx数据写入到10000H处,10002H处数据变为1123H

Debug跟踪

image-20230903224326446

注意:三个地址段可以设置为一样滴

image-20230903224427860

站内搜索

没有找到内容!