汇编 | 数据段寄存器DS和[address]
Description
CPU要读写一个内存单元的时候,必须先给出这个内存单元的地址,在8086PC中,内存地址由段地址和偏移地址组成。8086CPU中有一个DS寄存器,通常用来存放要访问
数据的段地址。比如我们要读取10000H单元的内容,可以用如下的程序段进行。
mov bx,1000H
mov ds,bx
mov a1,[0]
上面的3条指令将10000H(1000:0)中的数据读到al中。
前面我们使用 mov 指令,可完成两种传送:
- 将数据直接送入寄存器;
- 将一个寄存器中的内容送入另一个寄存器。
也可以使用mov指令将一个内存单元中的内容送入一个寄存器中。
从哪一个内存单元送到哪一个寄存器中呢?在指令中必须指明。寄存器用寄存器名来指明,内存单元则需用内存单元的地址来指明。显然,此时 mov 指令的格式应该是:mov 寄存器名,内存单元地址。
“[…]”表示一个内存单元,“[…]”中的0表示内存单元的偏移地址。
我们知道,只有偏移地址是不能定位一个内存单元的,那么内存单元的段地址是多少呢?
指令执行时,8086CPU自动取 ds 中的数据为内存单元的段地址。
再来看一下,如何用 mov 指令从 \(10000H\) 中读取数据。\(10000H\) 用段地址和偏移地址表示为\(1000:0\),我们先将段地址 \(1000H\) 放入 ds,然后用 mov al,[0] 完成传送。mov 指令中的 [] 说明操作对象是一个内存单元,[]中的 \(0\)说明这个内存单元的偏移地址是 \(0\),它的段地址默认放在ds中,指令执行时,8086CPU会自动从 ds 中取出。
mov bx,1000H
mov ds,bx
若要用 mov al,[0] 完成数据从 \(1000:0\) 单元到 al 的传送,这条指令执行时,ds 中的内容应为段地址 \(1000H\) ,所以在这条指令之前应该将 \(1000H\) 送入 ds
如何把一个数据送入寄存器呢?我们以前用类似 “mov ax, l” 这样的指令来完成,从理论上讲,我们可以用相似的方式: mov ds, l000H,来将 \(1000H\) 送入 ds 。可是,现实并非如此,8086CPU不支持将数据直接送入段寄存器的操作,ds 是一个段寄存器,所以 mov ds, l000H 这条指令是非法的。那么如何将 \(1000H\) 送入 ds 呢?只好用一个寄存器来进行中转,即先将 \(1000H\) 送入一个一般的寄存器,如 bx ,再将 bx 中的内容送入 ds
为什么8086CPU不支持将数据直接送入段寄存器的操作?这属于8086CPU硬件设计的问题,我们只要知道这一点就行了。
问题3.2
写几条指令,将 al 中的数据送入内存单元 \(0000H\) 中,思考后看分析。
分析:
怎样将数据从寄存器送入内存单元?
从内存单元到寄存器的格式是:"mov寄存器名,内存单元地址”,
从寄存器到内存单元则是:"mov内存单元地址,寄存器名”。
\(10000H\) 可表示为 \(1000:0\) ,用 ds 存放段地址 \(1000H\) ,偏移地址是 \(0\),则 mov [0],al 可完成从 al 到 \(10000H\) 的数据传送。完整的几条指令是:
mov bx, 1000H
mov ds, bx
mov [0],a1
段寄存器扩展汇总
\1. 在8086CPU中,使用 \(16\) 位寄存器来存储一个字(word). 高 \(8\) 位存放高位字节,低 \(8\) 位存放低位字节。
在内存中存储时,由于内存单元是字节单元,则一个字(word)需要用 \(2\) 个地址连续的内存单元来存放 。
这个字(word)的低位字节存放在低地址单元中,高位字节存放在高地址单元中。
\2. 我们将起始地址为 \(N\) 的字单元简称为 \(N\) 地址字单元 。
如:一个字单元由 \(2、3\) 两个内存单元组成,则这个字单元的起始地址为 \(2\) ,我们可以说这是:\(2\) 地址字单元 。
\3. 字节单元与字单元。
一个内存单元可以存储 \(1\) 个字节数据(byte), 相当于 \(8\)位(bit)数据。称为"字节单元"。
一个字单元,大家知道,一个字(word)等于 \(2\) 个字节(byte), 所以
一个字单元,需要 \(2\) 个地址连续的字节单元存放。
字的低字节位放在低地址字节单元中,字的高字节位放在高地址字节单元中。
\4. CPU要读写一个内存单元的时候,必须先给出这个内存单元的地址,在8086CPU中,内存地址由段地址和偏移地址组成。
8086CPU中有一个DS寄存器,通常用来存放要访问数据的段地址。
如:我们要读取 \(10000H\) 单元的内容。
则:
mov bx, 1000H
mov ds, bx
mov al, [0]
mov 指令也可以将一个内存单元中的内容送入一个寄存器中。[...]表示一个内存单元。[...]中的0表示内存单元的偏移地址。
指令执行时,8086CPU自动取DS寄存器中的数据为内存单元的段地址。
\5. 8086CPU不支持将数据直接送入段寄存器的操作 ,DS是一个段寄存器,所以 mov ds, 1000H是非法的指令 。
可以用一个寄存器来中转,如:
mov bx, 1000H
mov ds, bx
\6. 字的传送
因为8086CPU是 \(16\) 位结构,有 \(16\) 根数据线,所以一次性可以传送 \(16\) 位的数据,也就是说,一次性可以传送一个字(word).
只要mov指令中给出 \(16\) 位寄存器就可以进行 \(16\) 位数据的传送了。如:
mov bx, 1000H
mov ds, bx
mov ax, [0] ; 1000:0 处的字形数据送入AX寄存器中
mov [0], cx ; cx寄存器中的16位数据送到1000:0处
\6. 例子
内存情况, 如下所示,写出下面指令执行后寄存器 \(AX、BX、CX\) 中的值。
10000H 23H
10001H 11H
10002H 22H
10003h 66H
mov ax, 1000H
mov ds, ax
mov ax, [0]
mov bx, [2]
mov cx, [1]
add bx, [1]
add cx, [2]
解析:
mov ax, 1000H
mov ds, ax
上面2条指令,将DS寄存器设置为 \(1000H\) (代码段地址)
mov ax, [0] 由于AX是16位寄存器,所以需要把字型数据送入AX
\(1000:0\) 内存单元中存储着字型数据的低 \(8\) 位,\(23H\)
\(1000:1\) 内存单元中存储着字形数据的高 \(8\) 位,\(11H\)
指令执行时,字型数据的高 \(8\) 位送入AH,字形数据的低 \(8\) 位送入AL,则AX寄存器的值为 \(1123H\)。
后面的原理相同。
汇编 | 数据段寄存器DS和[address]的更多相关文章
- Linux从头学03:如何告诉 CPU,代码段、数据段、栈段在内存中什么位置?
作 者:道哥,10+年的嵌入式开发老兵. 公众号:[IOT物联网小镇],专注于:C/C++.Linux操作系统.应用程序设计.物联网.单片机和嵌入式开发等领域. 公众号回复[书籍],获取 Linux. ...
- 32位汇编基础_cpu 寄存器
32位通用寄存器 EAX EBX ECX EDX EBP ESP ESI EDI 八个寄存器都可以作为普通的数据寄存器使用.但有的有特殊的用途: EAX 为累加器, ECX 为计数器, E ...
- CPU的段寄存器
http://www.cnblogs.com/tolimit/p/4775945.html?utm_source=tuicool&utm_medium=referral CPU的段寄存器 在C ...
- 8086汇编——Introduction(8086内部寄存器,段寄存器,存储器分段)
8086汇编--Introduction 一.8086CPU的三种工作模式 实模式:只有低20位地址线起作用,仅能寻址第一个1MB的内存空间.MS DOS运行于该模式下. 保护模式:在该模式下,机器可 ...
- 汇编之FS段寄存器
FS寄存器指向当前活动线程的TEB结构(线程结构) 偏移 说明 000 指向SEH链指针 004 线程堆栈顶部 008 线程堆栈底部 00C SubSystemTib 010 FiberD ...
- “段寄存器”的故事[转](彻底搞清内存段/elf段/实模式保护模式以及段寄存器)
http://blog.csdn.net/michael2012zhao/article/details/5554023 一. 段寄存器的产生 段寄存器的产生源于Intel 8086 CPU体系结构中 ...
- bss段,代码段及数据段,堆栈段的区别
bss段,代码段及数据段,堆栈段的区别 时间:2012-11-21 10:0772人阅读 BSS段:BSS段(bss segment)通常是指用来存放程序中未初始化的全局变量的一块内存区域.BSS是英 ...
- 韦东山yy公开课笔记(2)--汇编,段,栈,重定位/链接地址,位置无关吗
1. 要不要学习汇编 可以只懂一点,工作中基本不用,一旦用就是出了大问题 ldr : load 读内存 ldr r0, [r1] : r1里存放的是地址值, 去这个地址读取4字节的内容,存入r0 s ...
- 数据段、代码段、堆栈段、BSS段的区别
进程(执行的程序)会占用一定数量的内存,它或是用来存放从磁盘载入的程序代码,或是存放取自用户输入的数据等等.不过进程对这些内存的管理方式因内存用 途 不一而不尽相同,有些内存是事先静态分配和统一回收的 ...
- Linux 之 AT&T汇编语言 mov、add、sub指令、数据段
mov指令的几种形式: mov 寄存器. 数据 mov ax,8888 mov 寄存器. 寄存器 mov bx,ax mov 寄存器. 内存单元 mov ax,[0] mov 内存单元.寄存器 mov ...
随机推荐
- 机器学习-ROC曲线:技术解析与实战应用
本文全面探讨了ROC曲线(Receiver Operating Characteristic Curve)的重要性和应用,从其历史背景.数学基础到Python实现以及关键评价指标.文章旨在提供一个深刻 ...
- STM32外设:串行通信 USART、I2C、SPI
USART:Universal Synchronous Asynchronous Receiver Transmitter 通用同步异步接收发送器 UART:异步中断 主要功能:接收指定长度的帧 数据 ...
- OpenTiny Vue 3.12.0 发布:文档大优化!增加水印和二维码两个新组件🎈
你好,我是 Kagol. 非常高兴跟大家宣布,2023年11月30日,OpenTiny Vue 发布了 v3.12.0 . OpenTiny 每次大版本发布,都会给大家带来一些实用的新特性,10.24 ...
- C++ Qt开发:Qt的安装与配置
Qt是一种C++编程框架,用于构建图形用户界面(GUI)应用程序和嵌入式系统.Qt由Qt公司(前身为Nokia)开发,提供了一套跨平台的工具和类库,使开发者能够轻松地创建高效.美观.可扩展的应用程序. ...
- 【matlab混沌理论】1.5.洛伦兹模型的分析
洛伦兹方程用于生成y变量的图.这是对三种y初始条件敏感依赖的一个例子. 1.洛伦兹吸引子的y敏感依赖的着色图 input: % 洛伦兹方程用于生成y变量的图.x和z的初始条件保持不变,但y的初始条件在 ...
- MybatisPlus属性自动填充
阿里巴巴开发规范,对于每一张表都因该有id(主键),createTime(创建时间),updateTime(修改时间)这三个字段 主键ID我们可以使用自增,或者雪花算法 创建时间修改时间我们可以使用数 ...
- 使用kubeadm在Centos8上部署kubernetes1.18
// 查看系统版本 cat /etc/centos-release CentOS Linux release 8.1.1911 (Core) // 如果系统环境为8.0(云服务器默认最大安装环境为8. ...
- IDEA插件(2 高效开发)
一.高效开发代码插件 ① .TONGYI Lingma(阿里通灵代码AI插件) 提问回答 右键其他功能,只需要登录阿里账号就可以使用 ②.Talk X(AI提示插件,和阿里通灵代码很像的功能) ③.A ...
- 部署堡垒机6——配置Nginx及其他组件
Lina部署 cd /opt wget https://github.com/jumpserver/lina/releases/download/v2.28.7/lina-v2.28.7.tar.gz ...
- adobe全家桶破解网站
原文链接:https://baiyunju.cc/8602 总有一些国内.外的大神在破解Adobe全家桶软件,包括Windows.Mac系统最新版的2021.2022版PS.AI.PR.PL.ME.I ...