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

简介:

内存中字的存储

在cpu中,用16位来存储一个字,高8位存放高字节,低8位存放低位字节。在内存中时,由于内存单元是字节单元,刚一个字要用2个地址连续的内存单元来存放,字的低位字节存在低地址单元. 

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

0地址单元中存放的字节型数据为20H,0地址单元中存放的字型数据为4E20H,2地址单元中存放的字节型数据为12H,2地址单元中存放的字型数据为0012H,

DS和[address]

8086CPU中有一个DS寄存器,通常用来存放要访问数据的段地址。比如我们要读取10000H单元的内容,可以用如下的程序段进行:

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

[……]表示一个内存单元,0表示内存单元的偏移地址

字的传送

8086CPU是16位结构,可以一次性的传送16位的数据,即一次性传送一个字。例如:

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

问题1

内存中的情况如下图,

写出下面指令执行后寄存器ax,bx,cx中的值

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

mov ax,1000H 执行后,ax=1000H

mov ds,ax 执行后,ds=1000H

mov ax,[0] 执行后,ax=1123H

mov bx,[2] 执行后,bx=6622H

mov cx,[1] 执行后,cx=2211H

add bx,[1] 执行后,bx=bx+[1]=6622H+2211H=8833H

add cx,[2] 执行后,cx=6622H+2211H=8833H

问题2

内存中的情况如下图,

写出下面指令执行后寄存器ax,bx,cx中的值

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

mov ax,1000H 执行后,ax=1000H

mov ds,ax 执行后,ds=1000H

mov ax,11316 执行后,ax=2C34H

mov [0],ax 执行后,1000:1存储2C,1000:0存储34

mov bx,[0] 执行后,bx=2C34

sub bx,[2] 执行后,bx=2C34-1122=1B12

mov [2],bx 执行后,1000:2存储1B12

指令执行结果如下:

mov、add、sub指令

mov指令有以下几种形式:

mov 寄存器,数据

mov 寄存器,寄存器

mov 寄存器,内存单元

mov 内存单元,寄存器

mov 内存单元,段寄存器

mov 段寄存器,寄存器

mov 寄存器,段寄存器

下面通过debug来验证一下"mov 寄存器,段寄存器"指令:

验证"mov 内存单元,段寄存器"指令:

mov ax,1000H
mov ds,ax
mov [0],cs

add和sub指令同mov一样,都有两个操作对象,也可以有下面几种形式:

add 寄存器,数据

add 寄存器,寄存器

add 寄存器,内存单元

add 内存单元,寄存器

sub 寄存器,数据

sub 寄存器,寄存器

sub 寄存器,内存单元

sub 内存单元,寄存器

数据段

相关结论:

1、字在内存中存储时,要用两个连续的内存单元来存放,字的低字节放在低地址单元,高字节放在高地址单元

2、用mov指令访问内存单元,可以在mov指令中只给出单元的偏移地址,此时,段地址默认在DS寄存器中

3、[address]表示一个偏移地址为address的内存单元

4、在内存和寄存器之间传送字型数据时,高地址单元和高8位寄存器,低地址单元和低8位寄存器相对应

5、mov、sub、add是具有两个操作对象的指令,jmp是具有一个操作对象的指令

CPU提供的栈机制

在8086CPU编程的时候,可以将一段内存当做栈来使用,8086CPU提供2种栈的操作:push和pop,都是以字为单位进行操作

在8086CPU中,提供2中寄存器分别栈顶地址:段寄存器SS和寄存器SP,任意时刻,SS:SP指向栈顶元素。入栈时,栈顶从高地址向低地址方向增长

首先看一段代码:

mov ax, 0123H
push ax
mov bx, 2266H
push bx
mov cx, 1122H
push cx
pop ax
pop bx
pop cx

执行过程如下图:

注意:字型数据用两个单元存放,高地址单元存放高8位,低地址单元存放低8位

8086CPU中,有2个寄存器,段寄存器SS和寄存器SP,栈顶的段地址存放在SS中,偏移地址存放在SP中。任意时刻,SS:SP指向栈顶元素

8086CPU不保证我们对栈的操作不会超界,我们在编程的时候要自己操心栈顶超界的问题

push、pop指令

push和pop指令是可以在寄存器和内存之间传送数据的,push和pop指令可以是如下的形式:

push 寄存器 ;将一个寄存器中的数据入栈

pop 寄存器 ;出栈,用一个寄存器接收出栈的数据

push 段寄存器 ;将一个段寄存器中的数据入栈

pop 段寄存器 ;出栈,用一个段寄存器接收出栈的数据

;push和pop指令也可以在内存单元和内存单元之间传送数据,还可以:

push 内存单元 ;将一个内存单元处的字入栈(栈的操作都是以字为单位)

pop 内存单元 ;出栈,用一个内存字单元接收出栈的数据

比如下面的代码:

mov ax, 1000H
mov ds, ax ;内存单元的段地址要放在ds中
push [0] ;将1000:0处的字入栈中
pop [2]  ;出栈,出栈的数据送入1000:2处
目录
相关文章
|
15天前
|
存储 编译器 Linux
【c++】类和对象(上)(类的定义格式、访问限定符、类域、类的实例化、对象的内存大小、this指针)
本文介绍了C++中的类和对象,包括类的概念、定义格式、访问限定符、类域、对象的创建及内存大小、以及this指针。通过示例代码详细解释了类的定义、成员函数和成员变量的作用,以及如何使用访问限定符控制成员的访问权限。此外,还讨论了对象的内存分配规则和this指针的使用场景,帮助读者深入理解面向对象编程的核心概念。
43 4
|
30天前
|
缓存 算法 数据处理
如何选择合适的内存访问模式
【10月更文挑战第20天】如何选择合适的内存访问模式
42 1
|
1月前
|
存储 容器
内存越界访问(Out-of-Bounds Access)
【10月更文挑战第12天】
146 2
|
1月前
|
Rust 编译器
|
2月前
|
存储 网络协议 大数据
一文读懂RDMA: Remote Direct Memory Access(远程直接内存访问)
该文档详细介绍了RDMA(远程直接内存访问)技术的基本原理、主要特点及其编程接口。RDMA通过硬件直接在应用程序间搬移数据,绕过操作系统协议栈,显著提升网络通信效率,尤其适用于高性能计算和大数据处理等场景。文档还提供了RDMA编程接口的概述及示例代码,帮助开发者更好地理解和应用这一技术。
|
2月前
|
存储 安全 Linux
将文件映射到内存,像数组一样访问
将文件映射到内存,像数组一样访问
31 0
|
2月前
ARM64技术 —— MMU处于关闭状态时,内存访问是怎样的?
ARM64技术 —— MMU处于关闭状态时,内存访问是怎样的?
|
3月前
|
存储 编译器 C语言
【C语言篇】数据在内存中的存储(超详细)
浮点数就采⽤下⾯的规则表⽰,即指数E的真实值加上127(或1023),再将有效数字M去掉整数部分的1。
385 0
|
29天前
|
存储 C语言
数据在内存中的存储方式
本文介绍了计算机中整数和浮点数的存储方式,包括整数的原码、反码、补码,以及浮点数的IEEE754标准存储格式。同时,探讨了大小端字节序的概念及其判断方法,通过实例代码展示了这些概念的实际应用。
60 1
|
1月前
|
存储
共用体在内存中如何存储数据
共用体(Union)在内存中为所有成员分配同一段内存空间,大小等于最大成员所需的空间。这意味着所有成员共享同一块内存,但同一时间只能存储其中一个成员的数据,无法同时保存多个成员的值。