前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >8086汇编语言之数据段和代码段以及栈段的理解

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

作者头像
乱码三千
发布2021-08-24 15:13:13
2.1K0
发布2021-08-24 15:13:13
举报
文章被收录于专栏:乱码三千乱码三千

数据段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
本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2021-08-12,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 乱码三千 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 数据段DS+偏移地址段BX
  • 代码段CS+偏移地址段IP
  • 栈段SS+偏移地址段SP
  • 什么是段
  • 为什么要这样划分?
  • 段的赋值
相关产品与服务
容器服务
腾讯云容器服务(Tencent Kubernetes Engine, TKE)基于原生 kubernetes 提供以容器为核心的、高度可扩展的高性能容器管理服务,覆盖 Serverless、边缘计算、分布式云等多种业务部署场景,业内首创单个集群兼容多种计算节点的容器资源管理模式。同时产品作为云原生 Finops 领先布道者,主导开源项目Crane,全面助力客户实现资源优化、成本控制。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档