当前位置: 首页 > news >正文

寄存器(内部访问)

内存中字的储存

我们之前提到过,字由两个字节组成,当我们用16位寄存器来储存时,把字分别储存在连续的两个内存单元中,高位字节放在高地址单元中,低位字节则放在低位地址单元中。

例如上图,0、1两个单元存放了20000(4E20H),这两个单元可以看成起始地址为0的字单元,这里提出了字单元这个概念:存放一个字的两个内存单元。同理,我们不止可以将0、1看作一个字单元,也可以将2、3看作一个字单元,任意两个连续的内存单元组成一个字都可以看成字单元,默认编号小的作为高地址。

DS和[address]

之前提到过,要读写一个单元时要先给出目标内存单元的地址,8086CPU中内存物理地址由段地址x16+偏移地址形成,其实这句话并不完整,8086CPU中DS寄存器通常用来存放要访问的数据的段地址,之前说到过CS寄存器与IP寄存器联用指示要读取的指令的内存单元的物理地址,而DS寄存器区别于CS寄存器的是DS寄存器与如 BX、SI、DI寄存器联用用来指示数据的内存单元的物理地址,这也就解决了内存中所有数据不论是数据还是指令都以二进制数形式存在却能运用的问题。

由于8086CPU的硬件设置问题,8086CPU不支持将数据直接送入段寄存器的操作,我们不能直接使用mov ds,1000H这个指令直接将1000H这个数据送入ds这个段寄存器中,但是我们可以利用一个合法寄存器当作中转,先使用mov ax,1000H将1000H送入ax中,再使用mov ds,ax寄存器中的内容送入ds段寄存器中。

mov bx,1000H     mov ds,bx      mov al,[0]这三条指令实现了将10000H(1000:0)中的数据读取到a1中。

分步看一下,前两步按照上面所说的是将1000H的数据移动到ds段寄存器中,重要是第三步:首先看一下mov al,[0]这个格式al是移动目标寄存器,[0]内存单元的偏移地址,但是只有偏移地址是不能指示一个内存单元的,这时候在指令执行时,8086CPU会自动取DS中的数据为内存单元的段地址,这个段地址和[0]中括号中的偏移地址联合指向目标地址,前面两步我们将1000H送入了ds中,所有现在段地址就是1000H与偏移地址0运算之后得到10000H这个物理地址,所以我们将读取10000H这个地址的内存单元中的数据给al,就实现了整个过程

当然也可以实现将寄存器中的数据读到内存单元的操作mov bx,1000H     mov ds,bx      mov [0],al

同样偏移地址是0,段地址是1000H,这三个指令的意义就是将al寄存器中的数据读取到10000H内存地址的操作。

相关文章:

  • WordPress靶场攻略
  • 微服务》》Kubernetes (K8S) 集群配置网络》》Calico
  • deepseek使用记录24——小灵
  • docker、docker-compose常用命令
  • Java 实现排序算法 TopK 问题
  • AcWing 839:模拟堆 ← multiset + unordered_map
  • 4.玩转热图(续:矩阵式网络关系热图、Pivot Table 热图、三维/交互式热图)——Python数据挖掘代码实践
  • 2025年优化算法:人工旅鼠算法(Artificial lemming algorithm,ALA)
  • Devops之Docker:Docker入门
  • Pandas数据分析
  • 深入解析 Service Worker 在 Chrome 扩展中的应用
  • redis,tar.gz安装后,接入systemctl报错解决
  • ESP32 BLE 初步学习笔记
  • 嵌入式C语言进阶(四)指针
  • NO.51十六届蓝桥杯备战|堆算法题|第k小|除2|最小函数值|序列合并|舞蹈课(C++)
  • CAN通信转TCP/IP通信协议解析
  • 蓝桥杯关于栈这个数据结构的一个算法题目
  • 【自学笔记】NFT基础知识点总览-持续更新
  • ⭐算法OJ⭐二叉树的后序遍历【树的遍历】(C++实现)Binary Tree Postorder Traversal
  • Mysql-经典实战案例(4):XtraBackup+binlog恢复实战
  • 习近平在河南洛阳市考察调研
  • 中方是否担忧美国主权信用评级下调?外交部:美国应采取负责任的政策措施
  • 波兰总统选举第一轮投票结束,出口民调显示将进入第二轮投票
  • 上海青少年书法学习园开园:少年以巨笔书写《祖国万岁》
  • 专利申请全球领先!去年我国卫星导航与位置服务产值超5700亿
  • 新疆多地市民拍到不明飞行物:几秒内加速消失,气象部门回应