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

3.1 内存中字的存储

在内存中存储时,由于内存单元是字节单元(一个单元存放一个字节),则一个字要用两个地址连续的内存单元来存放,这个字的低位字节存放在低地址单元中,高位字节存放在高地址单元中。 字单元,即存放一个字型数据(16位)的内存单元,由两个地址连续的内存单元组成。

3.2 DS和[address]

CPU要读写一个内存单元的时候,必须先给出这个内存单元的地址,在8086PC中,内存地址由段地址和便宜地址组成。 8086CPU中有一个DS寄存器,通常用来存放要访问数据的段地址。

例子1:

读取10000H中的内容,可以用如下的程序段进行:

mov bx 1000H //10000H用段地址和偏移地址表示为1000:0
mov ds,bx
mov al,[0] //[0]中的0说明这个内存单元的偏移地址是0,
          //它的段地址默认放在ds中

8086CPU不支持将数据直接送入段寄存器的操作(这是8086CPU硬件设计的问题),ds是一个段寄存器,所以mov ds,1000H是非法的。 要想将1000H送入ds寄存器,只能用一个寄存器进行中专,即先将1000H送入一个一般的寄存器,如bx,再将bx中的内容送入ds。

  • 1000H表示段地址
  • [0]表示偏移地址是0

例子2

将al中的数据送入内存单元10000H中

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

3.3 字的传送

8086CPU是16位结构,有16跟数据线,所以,可以一次性传送16位的数据。

例一

mov bx,1000H 
mov ds,bx
mov ax,[0]    //1000:0处的字型数据送入ax,    
              //[0]说明操作对象是一个内存单元,并且内存单元的偏移地址    
              //是0,它的段地址默认放在ds中    
mov [0],cx    //cx中的16位数据送到1000:0处    

3.4 mov、add、sub命令

mov命令可以有如下几种形式:

  • mov 寄存器,数据 比如,mov ax,5
  • mov 寄存器,寄存器 比如:mov ax,bx
  • mov 寄存器,内存单元 比如:mov ax,[0]
  • mov 内存单元,寄存器 比如:mov [0],ax
  • mov 段寄存器,寄存器 比如:mov ds,ax
  • mov 寄存器,段寄存器
  • mov 内存单元,寄存器

3.5 数据段

在编程时,我们可以根据需要,将一组内存单元定义为一个段。 将一段内存当作数据段,是我们在编程时的一种安排,我们可以在具体操作的时候,用ds存放数据段的地址,再根据需要,用相关指令访问数据段中的具体单元。

例子一

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

mov ax,123BH    
mov ds,ax      //将123BH送入ds中,作为数据段的段地址
mov al,0        //用al存放累加结果
add al,[0]      //将数据段第一个单元(偏移地址为0)中的数值加到al中
add al,[1]      //将数据段第二个单元(偏移地址为1)中的数值加到al中
add al,[2]      //将数据段第三个单元(偏移地址为2)中的数值加到al中

例子二

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

mov ax,123BH
mov ds,ax        //将123BH送入ds中,作为数据段的段地址
mov ax,0          //用ax存放累加结果
add ax,[0]
add ax,[2]
add ax,[4]        //一个字型数据占两个单元,所以偏移地址是0、2、4

3.1节~3.5节 小结

  • 字在内存中存储时,要用两个地址连续的内存单元来存放,字的低位字节存放在低地址单元中,高位字节存放在高地址单元中。
  • 用mov指令要访问内存单元,可以在mov指令中只给出单元的偏移地址,此时,段地址默认在DS寄存器中。
  • [address]表示一个偏移地址为address的内存单元。
  • 在内存和寄存器之间传送字型数据时,高地址单元和高8位地址、低地址单元和低8位寄存器相对应。
  • mov、add、sub是具有两个操作对象的指令。jmp是具有一个操作对象的指令。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏Petrichor的专栏

tensorflow: variable的值 与 variable.read_value()的值 区别

查看 tensorflow api manual 时,看到关于 variable.read_value() 的注解如图:

1693
来自专栏Deep Learning 笔记

和MNSIT打个招呼

作为深度学习的入门数据集,MNIST是个很好的选择,我们可以在官网 http://yann.lecun.com/exdb/mnist/下载。

1112
来自专栏大数据挖掘DT机器学习

文本分类中语料库的获取——搜狗语料库

这次主要总结搜过语料库的获取,因为老师要求20万数据,而我自己只爬了2万多,所以用到了搜狗的语料库. ? 在这个页面中,我选择的是一个月的数据,别小看一个月...

6888
来自专栏软件测试经验与教训

Python学习笔记(文件)

3519
来自专栏debugeeker的专栏

《coredump问题原理探究》windows版7.5节iterator

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/xuzhina/article/detai...

772
来自专栏企鹅号快讯

深度学习系列教程(六)tf.data API 使用方法介绍

"玩转TensorFlow与深度学习模型”系列文字教程,本周带来tf.data 使用方法介绍! 大家在学习和实操过程中,有任何疑问都可以通过学院微信交流群进行提...

3477
来自专栏用户画像

H5 新增的input元素的类型

search类型用于搜索域,如站点搜索或Google搜索。search域显示为常规的文本域。

703
来自专栏听雨堂

LegacyText的复制的Bug

        如果要动态复制一个LegacyText的文字,保持原来的中心位置,角度等,但修改其大小,发现有个别文字会偏离真正的中心位置,结果一番跟踪,发现问...

1917
来自专栏小文博客

C语言迷宫代码分享

2303
来自专栏李海辰的专栏

Unity 引擎资源管理代码分析 ( 1 )

目前网络上已经有很多介绍 Unity 资源管理机制、和 API 使用方法的文章,但少有文章从 Unity源码层面对其实现进行深度解析。作为一名喜欢打破砂锅璺到底...

1.2K1

扫码关注云+社区

领取腾讯云代金券