汇编语言之寄存器(内存访问)1

简介: 汇编语言之寄存器(内存访问)1

1、内存中字的存储

1.png

2、ds和【address】

CPU要读写一个内存单元的时候,必须先给出这个内存单元的地址,在8086CPU中,内存地址由段地址和偏移地址组成,


其中,段地址存放在段寄存器DS中,DS称作数据段寄存器。


如果我们要将内存地址为14A70的内存单元中的数据送入AL中,可以用如下的程序段进行:


Mov bx,1000H    ;把段地址1000H送入bx中。


mov ds,bx        ;把bx中的数值送入ds中。


Mov al,[4a70]     ;把段地址为1000H,偏移地址位4a70H的内存单元中的数据送入al中。


[address]表示一个内存单元,内存单元中的address表示偏移地址,它的中文翻译就是地址的意思。


内存单元[address],我们可以知道它的地址是多少,但它的数值是多少,我们并不知道。


3、mov指令

传送指令mov可以完成以下4种传送:


1:将数据直接送入寄存器。    如:mov ax,1230H。


2:将一个寄存器中的数据送入另一个寄存器。    如:mov ax,bx


3:将一个内存单元中的数据送入一个寄存器。    如:mov ax,[27b0]


4:将一个寄存器中的数据送入内存单元中。    如:mov [607c],bx


注意:不能直接用数据送给段寄存器,如:mov ds,1230H 是错误的,必须要用一个寄存器来进行中转。比如:


Mov bx,1230H


Mov ds,bx


这样就行了。为什么8086CPU不支持将数据直接送入段寄存器呢?这属于8086CPU硬件设计的问题,我们只要知道这一


点就行了。


4、add和sub指令

Mov指令有两个操作对象,add和sub同样有两个操作对象。


Add为加法指令,格式:add 操作对象1,操作对象2。功能:两数相加,并把结果保存到操作对象1中。


Add有以下几种形式:


Add 寄存器,数据    如:add ax, 8


Add 寄存器,寄存器    如:add ax, bx


Add 寄存器,内存单元    如:add ax, [27a0]


Add 内存单元,寄存器    如:add [46e9], bx



Sub为减法指令,格式:sub 操作对象1,操作对象2。功能:两数相减,即从操作对象1减去操作对象2,其结果保存到


操作对象1中。


Sub 也有以下几种形式:


Sub 寄存器,数据    如:sub ax, 9


Sub 寄存器,寄存器    如:sub ax, bx


Sub 寄存器,内存单元    如:sub ax, [b027]


Sub 内存单元,寄存器    如:sub [8601], bx


5、数据段

前面讲过(参见2.7节),对于8086PC机,在编程时,可以根据需要,将一组内存单元定义为一个段。我们可以将一组长度


为N(N≤64KB)、地址连续、起始地址为16的倍数的内存单元当作专门存储数据的内存空间,从而定义了一个数据段。


比如:用123B0H~123B9H这段内存空间来存放数据,我们就可以认为123B0H~123B9H这段内存是一个数据段,长度


为10个字节。


如何访问数据段中的数据呢?首先用DS存放数据段的段地址,然后用相关的指令访问数据段中的内存单元。


比如,将123B0H~123B9H的内存单元定义为数据段,现在要累加这个数据段中的前3个单元中的数据,代码如下:


Mov ax, 123BH


Mov ds, ax    ;将123BH送入ds中,作为数据段的段地址。


Mov al, 0      ;用al存放累加结果,先把al中的数据清零。


Add al, [0]     ;将数据段第一个单元(偏移地址为0)中的数值加到al中。


Add al, [1]     ;将数据段第二个单元(偏移地址为1)中的数据加到al中。


Add al, [2]     ;将数据段第三个单元(偏移地址为2)中的数据加到al中。



在1.5节中,我们说过,在内存中指令和数据没有任何区别,都是二进制信息,CPU在工作的时候,把有的信息看作指令,


把有的信息看作数据,那么CPU在什么时候把它看作指令?在什么时候把它看作数据呢?在2.5节中我们回答了第一个问题,现


在可以回答第二个问题了。


答:只要把这一段内存单元的段地址放到DS中,在用mov、add、sub等访问内存单元的指令时,CPU就会将这些内存单


元看作数据来访问。


6、栈

栈是一种具有特殊的访问方式的存储空间,它的特殊性就在于:最后进入这个空间的数据最先出去。可以用一个盒子和3本书


来描述栈的这种操作方式。


入栈:把A放入栈中,再把B放入栈中,然后再把C放入栈中。就形成了A、B、C


出栈:先出栈顶C,然后是B,然后A,


特点:先进后出


入栈和出栈。入栈就是将一个新的元素放到栈顶,出栈就是从栈


顶取出一个元素。栈顶的元素总是最后入栈,需要出栈时又最先被从栈中取出,栈的这种操作规则被称为LIFO(last in first out,

后进先出)


相关文章
|
16天前
|
存储 编译器 Linux
【c++】类和对象(上)(类的定义格式、访问限定符、类域、类的实例化、对象的内存大小、this指针)
本文介绍了C++中的类和对象,包括类的概念、定义格式、访问限定符、类域、对象的创建及内存大小、以及this指针。通过示例代码详细解释了类的定义、成员函数和成员变量的作用,以及如何使用访问限定符控制成员的访问权限。此外,还讨论了对象的内存分配规则和this指针的使用场景,帮助读者深入理解面向对象编程的核心概念。
43 4
|
2月前
|
缓存 算法 数据处理
如何选择合适的内存访问模式
【10月更文挑战第20天】如何选择合适的内存访问模式
43 1
|
2月前
|
存储 容器
内存越界访问(Out-of-Bounds Access)
【10月更文挑战第12天】
151 2
|
2月前
|
Rust 编译器
|
3月前
|
存储 网络协议 大数据
一文读懂RDMA: Remote Direct Memory Access(远程直接内存访问)
该文档详细介绍了RDMA(远程直接内存访问)技术的基本原理、主要特点及其编程接口。RDMA通过硬件直接在应用程序间搬移数据,绕过操作系统协议栈,显著提升网络通信效率,尤其适用于高性能计算和大数据处理等场景。文档还提供了RDMA编程接口的概述及示例代码,帮助开发者更好地理解和应用这一技术。
|
3月前
|
存储 安全 Linux
将文件映射到内存,像数组一样访问
将文件映射到内存,像数组一样访问
31 0
|
3月前
ARM64技术 —— MMU处于关闭状态时,内存访问是怎样的?
ARM64技术 —— MMU处于关闭状态时,内存访问是怎样的?
|
7月前
|
存储 Unix 编译器
汇编语言----X86汇编指令
汇编语言----X86汇编指令
233 2
|
2月前
|
存储 移动开发 C语言
【ARM汇编速成】零基础入门汇编语言之指令集(三)
【ARM汇编速成】零基础入门汇编语言之指令集(三)
|
2月前
|
编译器 C语言 计算机视觉
【ARM汇编速成】零基础入门汇编语言之指令集(二)
【ARM汇编速成】零基础入门汇编语言之指令集(二)
167 0

热门文章

最新文章

下一篇
无影云桌面