【汇编】内存中字的存储、用DS和[address]实现字的传送、DS与数据段

简介: 【汇编】内存中字的存储、用DS和[address]实现字的传送、DS与数据段

前言


汇编语言中,我们处理计算机内存中的数据时,需要理解如何存储和传送字(数据的一部分)。通过使用数据段寄存器 DS 和 [address] 这样的符号,我们能够有效地操作内存中的字,实现数据的传送和处理。


一、内存中字的存储


1.1 8086cpu字的概念

让我用通俗易懂的话给你介绍一下 8086 CPU 中的字的概念。

在计算机世界中,一个字通常表示一组二进制位,这个组合的长度是由计算机的架构决定的。在 8086 CPU 中,一个字由 16 位组成。每个位可以是 0 或 1,就像开关一样,有 16 个开关组合在一起,构成了一个字。


想象一下你有一串 16 个灯泡,每个灯泡可以是亮的(1)或者暗的(0)。这串灯泡就代表了一个字。当计算机处理数据时,它会以这样的字为单位进行操作。这些操作可以包括加法、减法、移动数据等等。


所以,8086 CPU 中的字就像是计算机处理信息的一种方式,就像我们平时用字来表达语言一样,计算机通过字来表达和处理数据。这个字的长度是 16 位,每位都有它的特定含义,就像字母构成单词一样,这些 16 位的二进制数构成了计算机世界中的“语言”基本单位。


1.2 16位的字存储在一个16位的寄存器中,如何存储?

1、回答

高8位放高字节,低8位放低字节

2、问题

16位的字在内存中需要2个连续字节存储,怎么存放?

3、回答

低位字节存在低地址单元,高位字节存在高地址单元

例:20000D(4E20H)存放0、1两个单元,18D

(0012H)存放在2、3两个单元

a9f096b5c34b4391a5dfed13eace211a.png

1.3 字单元

字单元:由两个地址连续的内存单元组成,存放一个字型数据(16位)

想象一下你有一个很长的故事,而你希望每次只读取一小段,而不是整篇文章。字单元就有点像这个故事中的一个小节,是计算机中用来处理数据的一小块单元。


在计算机的世界里,字单元是存储器中的一小部分,通常是由多个位(比如8位、16位、32位等)组成的。这些位就像是计算机的开关,可以表示不同的信息。


字单元可以存储一个数字、一个字符或者其他数据。它就像一个小盒子,可以装一些信息。当计算机需要处理数据时,它可以一次性处理一个字单元,就像你一次读一个小节的故事一样。


所以,字单元是计算机存储和处理信息的一种方式,是数据的一个小单元,让计算机更方便地管理和操作数据。


原理:在一个字单元中,低地址单元存放低位字节,高地址单元存放高位字节

在起始地址为0的单元中,存放的是4E20H

在起始地址为2的单元中,存放的是0012H

b1c6c31f3ee34ffd9cb0b058c3c36ac9.png

即是0、1可以组合:4E20H

1、2可以组合:124E

依次类推


二、用DS和[address]实现字的传送


2.1 字的传送是什么意思?

让我用通俗易懂的语言来解释一下汇编中的 DS 和 [address] 实现字的传送是什么意思。


首先,DS 是数据段寄存器的缩写,它在汇编语言中用来指示数据存储的位置。就像你有一个大抽屉,把不同类型的东西放在不同的抽屉里一样,DS 帮助计算机知道从哪里找到存储的数据。


然后,[address] 表示一个内存地址。你可以把内存地址看作是抽屉的编号,告诉计算机在哪里找到具体的数据。[address] 就像是对抽屉的引用,告诉计算机要去哪个抽屉找数据。


现在,当你在汇编语言中看到类似 MOV AX, [BX] 这样的指令时,它的意思是将 BX 寄存器中存储的地址所指向的数据(就像抽屉里的东西)传送到 AX 寄存器中。


总体来说,使用 DS 寄存器和 [address],汇编语言就像在抽屉中移动数据一样。DS 帮助找到正确的抽屉(数据段),而 [address] 则告诉计算机在这个抽屉中具体找哪个位置的数据。这样,就能够实现数据的传送和处理。


2.2 要求

CPU要读取一个内存单元的时候,必须先给出这个内存单元的地址;

原理

在8086PC中,内存地址由段地址和偏移地址组成(段地址:偏移地址)、

解决方案:DS和[address]配合

用 DS寄存器存放要访问的数据的段地址

偏移地址用[…]形式直接给出

例1

mov bx,1000H
mov ds,bx
mov al, [0]


将10000H(1000:0)

中的数据读到al中

例2

mov bx,1000H
mov ds,bx
mov [0],al


将al中的数据写到

10000H(1000:0)中

将段地址送入DS的两种方式

(1) mov ds, 1000H

(2)

mov bx, 1000H
mov ds, bx


例1

mov bx,1000H
mov ds,bx
mov al, [0]


8086CPU不支持将数据直接送入段寄存器

(硬件设计的问题)

套路:数据→一般的寄存器→段寄存器


8086传送16字节

8086CPU可以一次性传送一个字(16位的数据)

例如:

mov bx, 1000H
mov ds, bx
mov ax, [0] ;1000:0处的字型数据送入ax
mov [0], cx ;cx中的16位数据送到1000:0处


2.3 案例

案例1

mov ax, 1000H
mov ds, ax
mov ax, [0]
mov bx, [2]
mov cx, [1]
add bx, [1]
add cx, [2]


案例2

mov ax, 1000H
mov ds, ax
mov ax, 2C31
mov [0], ax
mov bx, [0]
sub bx, [2]
mov [2], bx


三、DS与数据段


3.1 DS与数据段是什么?

DS寄存器:

想象一下,你有一个大书柜,里面存放了很多不同的书籍。每一本书都有一个特定的位置,你需要知道在哪个部分找到它。DS 寄存器就好像是一张告诉你在书柜的哪个部分找书的地图。它指示计算机在内存中的哪个区域找到数据。


数据段:


现在,把这个书柜比作内存,而书柜的每个抽屉就是一个数据段。每个抽屉里存放着一些相关的信息,可能是一组数字、字符或其他数据。数据段就像是书柜的一个部分,用来组织和存储特定类型的数据。


因此,当我们说 DS 寄存器与数据段有关时,我们是在告诉计算机在内存中的哪个区域找到数据。就好比你要找一本书,首先要知道在哪个书柜的哪个抽屉里找,DS 寄存器就提供了这个信息,而数据段就是具体的书柜部分,其中存放着相关的数据。


在汇编语言中,通过设置 DS 寄存器,我们可以定位到正确的数据段,就像通过地图找到正确的书柜一样。这有助于我们在程序中有效地访问和处理数据。


3.2 对内存单元中数据的访问

对于8086PC机,可以根据需要将一组内存单元定义为一个段。

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

将一组长度为N(N≤64K)、地址连续、起始地址为16的倍数的内存单元当作专门存储数

据的内存空间,从而定义了一个数据段。

例:用123B0H~123B9H的空间来存放数据

段地址:123BH 起始偏移地址:0000H 长度:10字节

段地址:1230H 起始偏移地址:00B0H 长度:10字节

… :处理方法:(DS)😦[address])

用DS存放数据段的段地址

用相关指令访问数据段中的具体单元,单元地址由[address]指出


3.3 将123B0H~123BAH的内存单元定义为数据段

累加数据段中的前3个单元中的数据

mov ax, 123BH
mov ds, ax
mov al, 0
add al, [0]
add al, [1]
add al, [2]


da2218cb80f949b8af8a2031897bab40.png

累加数据段中的前3个字型数据

mov ax, 123BH
mov ds, ax
mov ax, 0
add ax, [0]
add ax, [2]
add ax, [4]


2d3907c6c29d46008ba517d6f439272f.png


总结


在汇编语言中,理解如何存储和传送字是关键的。通过使用 DS 寄存器和 [address],我们能够精确地定位内存中的数据,并在不同的数据段中操作。这就好比在巨大的书库中,通过标识书架和特定页面的方式找到并使用我们需要的信息。这些概念是理解计算机内存工作原理和编写有效汇编代码的基础。

相关文章
|
2月前
|
存储 编译器 C语言
【C语言篇】数据在内存中的存储(超详细)
浮点数就采⽤下⾯的规则表⽰,即指数E的真实值加上127(或1023),再将有效数字M去掉整数部分的1。
|
3月前
|
存储 分布式计算 Hadoop
HadoopCPU、内存、存储限制
【7月更文挑战第13天】
213 14
|
2月前
|
存储 监控 Docker
如何限制docker使用的cpu,内存,存储
如何限制docker使用的cpu,内存,存储
|
3月前
|
存储 固态存储 芯片
计算机中内存与存储
【7月更文挑战第28天】
42 1
|
3月前
|
存储 弹性计算 程序员
新手程序员如何阿里云服务器配置?新人开发者CPU内存带宽存储怎么选?
对于新手开发者、个人或学生选择阿里云服务器,推荐ECS经济型e实例(ecs.e-c1m1.large),适用于小型网站或轻量应用。配置2核2G内存、3M固定带宽、40G ESSD系统盘,仅99元/年且续费同价。
|
2月前
|
存储 编译器 C语言
数据在内存中的存储
数据在内存中的存储
|
3月前
|
存储 Java 程序员
Java面试题:方法区在JVM中存储什么内容?它与堆内存有何不同?
Java面试题:方法区在JVM中存储什么内容?它与堆内存有何不同?
56 10
|
3月前
|
运维 DataWorks 安全
DataWorks产品使用合集之如何查看空间资源、CPU、内存和存储空间容量
DataWorks作为一站式的数据开发与治理平台,提供了从数据采集、清洗、开发、调度、服务化、质量监控到安全管理的全套解决方案,帮助企业构建高效、规范、安全的大数据处理体系。以下是对DataWorks产品使用合集的概述,涵盖数据处理的各个环节。
|
3月前
|
存储 Rust JavaScript
Rust 问题之TypeScript 代码,变量 s 存储在栈内存中还是堆内存中如何解决
Rust 问题之TypeScript 代码,变量 s 存储在栈内存中还是堆内存中如何解决
|
4月前
|
存储 Java C++
Java虚拟机(JVM)管理内存划分为多个区域:程序计数器记录线程执行位置;虚拟机栈存储线程私有数据
Java虚拟机(JVM)管理内存划分为多个区域:程序计数器记录线程执行位置;虚拟机栈存储线程私有数据,如局部变量和操作数;本地方法栈支持native方法;堆存放所有线程的对象实例,由垃圾回收管理;方法区(在Java 8后变为元空间)存储类信息和常量;运行时常量池是方法区一部分,保存符号引用和常量;直接内存非JVM规范定义,手动管理,通过Buffer类使用。Java 8后,永久代被元空间取代,G1成为默认GC。
55 2