作者:黑剑 
出处:http://www.cnblogs.com/blacksword/

8086/8088 寻址方式补充篇

上一节讲述了8086/8088 CPU寻址方式,通过了解它的寻址方式会使得今后学习8086/8088汇编语言指令变得更加容易,因为汇编语言中大多数的指令就是对数据进行处理和运算。

但是看完上一节内容,不仅没有让人觉得有所收获,反而增添了对汇编的一些恐惧心理。在收到一些人的回复后我回头审视了一下上一节的内容,确实内容显得比较的专业,很容易让人产生一种压抑的心情。后来,我找了王爽老师编写的《汇编语言》看了看,发现这本书确实写得会比较地通俗,而且看完以后会有一种犹如醍醐灌顶的感觉。所以思量了一下,决定参考王爽老师的经典大作,对上一节的内容进行一下补充。这里,我主要参考了第8章“数据处理的两个基本问题”,自认为里面总结的内容补充进来还是相当得体的。


这一节主要围绕两个基本问题展开:

1)计算机要处理的数据在什么地方?

2)计算机要处理的数据有多长?

那么,我们为什么要关心这些问题?同样,正如我在前面说到的,汇编语言中大多数的指令就是对数据进行处理和运算的。而既然是这个样子,那么通常计算机中的数据有两种比较重要的属性:地址和长度。因而,我们需要认识这两个基本问题,以及上一节所讲到的寻址方式。


知识回顾

首先我们需要回顾一些知识,这些也是在前面的小节中讲述过的。

引入两个描述性符号:reg和sreg。其中,reg用来表示一个寄存器,sreg用来表示一个段寄存器。

reg的集合包括: ax bx cx dx ah al bh bl ch cl dh dl sp bp si di
 sreg集合包括: ds ss cs es

四个特殊的寄存器:bx si di bp,总结一下它们的特点:

1) 在8086CPU中 只有这4个寄存器可以用在"[...]"中来进行内存单元的寻址。
比如下面的指令是正确的:

mov ax, [bx]         ; right

mov ax, [bx+si]     ; right

mov ax, [bx+di]     ; right

mov ax, [bp]          ; right

mov ax, [bp+si]      ; right

mov ax, [bp+di]      ; right

相反,下面这些指令是错误的:

mov ax, [cx]         ; wrong

mov ax, [ax]         ; wrong

mov ax, [dx]         ; wrong

mov ax, [ds]         ; wrong

2) 在[...]中,这4个寄存器可以单个出现,或只能以4种组合出现:bx和si、bx和di、bp和si、bp和di。
比如下面这些指令就是正确的:

mov ax, [bx]                  ; right

mov ax, [si]                   ; right

mov ax, [di]                   ; right

mov ax, [bp]                  ; right

mov ax, [bx+si]              ; right

mov ax, [bx+di]              ; right

mov ax, [bp+si]              ; right

mov ax, [bp+di]              ; right

mov ax, [bx+si+idata]     ; right

mov ax, [bx+di+idata]     ; right

mov ax, [bp+di+idata]     ; right

mov ax, [bp+si+idata]     ; right

而下面的指令是错误的:

mov ax, [bx+bp]    ; wrong

mov ax, [si+di]       ; wrong

3)只要在[...]中使用寄存器bp,而指令中没有显性地给出段地址,段地址就默认在ss中。
比如:

mov ax, [bp]                       ; (ax) = ( (bp) + (ss) * 10H )

mov ax, [bp+idata]              ; (ax) = ( (bp) + idata + (ss) * 10H )

mov ax, [bp+si]                   ; (ax) = ( (bp) + (si) + (ss) * 10H )

mov ax, [bp+si+idata]          ; (ax) = ( (bp) + (si) + idata + (ss) * 10H )

接下来的内容比较重要,主要是结合8086/8088汇编语言来回答之前的两个问题。


机器指令处理的数据在什么地方?
绝大部分机器指令都是进行数据处理的指令,处理大致可分为3类:读取、写入、运算。

指令在执行前,所要处理的数据可以在3个地方:CPU内部、内存、端口。

数据位置的表达?
总共有3个概念来表达数据的位置
1)立即数(idata)
对于直接包含在机器指令中的数据,在汇编指令中直接给出。例如:

mov ax, 1
add bx, 2000h
or bx, 00010000b
mov al, 'a'

2)寄存器
指令要处理的数据在寄存器中,在汇编指令中给出相应的寄存器名。

mov ax, bx

mov ds, ax

push bx

mov ds:[0], bx

push ds

mov ss, ax

mov sp, ax

3)段地址(SA)和偏移地址(EA)
数据在内存中,在汇编指令中用[X]的格式给出EA,SA在某个段寄存器中。存放段地址的寄存器可以是默认的,比如:

mov ax, [0]

mov ax, [di]

mov ax, [bx+8]

mov ax, [bx+si]

mov ax, [bx+si+8]

等指令,段地址默认在ds中;而如下

mov ax, [bp]

mov ax, [bp+8]

mov ax, [bp+si]

mov ax, [bp+si+8]

等指令,段地址默认在ss中。
存放段地址的寄存器也可以是显性给出的。
比如:

mov ax, ds:[bp]

mov ax, es:[bx]

mov ax, ss:[bx+si]

mov ax, cs:[bx+si+8]


指令要处理的数据有多长?
8086CPU的指令,可以处理两种尺寸的数据,byte和word。所以在机器指令中要指明,指令进行的是字操作还是字节操作。这里主要通过三种方式可以指明数据尺寸:
1)通过寄存器名指明要处理的数据的尺寸。
例如,下面指令中,寄存器指明了指令进行的是字操作。

mov ax, 1

mov bx, ds:[0]

mov ds, ax

mov ds:[0], ax

inc ax

add ax, 1000

下面指令中,寄存器执行了指令进行的是字节操作。

mov al, 1

mov al, bl

mov al, ds:[0]

mov ds:[0], al

inc al

add al, 100

2)在没有寄存器名存在的情况下,用操作符X ptr指明内存单元的长度,X在汇编指令中可以为word或byte。
例如,下面的指令中,用word ptr指明了指令访问的内存单元是一个字单位。

mov word ptr ds:[0], 1

inc word ptr [bx]

inc word ptr ds:[0]

add word ptr [bx], 2

又如,下面的指令中,用byte ptr指明了指令访问的内存单元是一个字节单位。

mov byte ptr ds:[0], 1
inc byte ptr [bx]
inc byte ptr ds:[0]
add byte ptr [bx], 2

3)其他方法
有些指令默认了访问的是字单元还是字节单元,比如,push [1000H]就不用指明访问的是字单元还是字节单元,因为push指令只进行字操作。

8086/8088 寻址方式补充篇相关推荐

  1. 8086/8088 寻址方式

    作者:黑剑  出处:http://www.cnblogs.com/blacksword/ 8086/8088 寻址方式 这一节讲解8086/8088寻址方式,所谓寻址方式,就是寻找操作数或操作数地址的 ...

  2. 微机笔记2——8086/8088指令系统

    8086/8088寻址方式 寄存器寻址 操作数存放在寄存器中 立即寻址 操作数存放在内存代码段 直接寻址 操作数存放在内存 寄存器间接寻址 操作数存放在内存 变址寻址 操作数存放在内存 基址加变址寻址 ...

  3. 微机原理8086/8088——指令系统与寻址方式

    微机原理8086/8088概念系列 微机原理8086/8088--微型计算机组成 微机原理8086/8088--微处理器功能结构 微机原理8086/8088--内部寄存器 微机原理8086/8088- ...

  4. 8086/8088 存储器分段概念

    这一节主要讲述8086/8088 存储器分段的概念. 目的 从8086 CPU开始采用了分段的方法管理存储器,只有充分理解存储器分段的概念和存储器逻辑地址和物理地址的关系,才能有助于我们掌握8086/ ...

  5. 1MB等于多少BYTE?8086/8088寻址段地址与偏移地址解释

    8086/8088有20条地址线,它的直接寻址能力为1MB.也就是在一个系统中可以有多达1MB的存储器,地址从00000H-FFFFFH.给定任意一个20位物理地址,就可以从中取出需要的指令和操作数. ...

  6. 汇编语言之8086/8088指令系统

    Typist : Akame Qixisi / Excel Bloonow 在我学习汇编语言(基于8086)的过程中,遇到过一些想要某些操作却不知道指令的情况,所以在这里统一记录一下.如有错误或不同观 ...

  7. 8086汇编语言寻址方式、基本指令和调试指令

    一.80x86/Pentium 各种寻址方式 1.立即寻址 立即寻址方式下,操作数作为立即数直接包含在指令中,紧跟在操作码之后与其一起 存放在代码段区域.因此,立即数总是和操作码一起被存入 CPU 的 ...

  8. C# 10 新特性 —— 补充篇

    C# 10 新特性 -- 补充篇 Intro 前面已经写了几篇文章介绍 C# 10 新特性的文章,还有一些小的更新 Constant interpolated strings 在之前的版本中,如果想要 ...

  9. C# 9 新特性 —— 补充篇

    C# 9 新特性 -- 补充篇 Intro 前面我们分别介绍了一些 C# 9 中的新特性,还有一些我觉得需要了解一下的新特性,写一篇作为补充. Top-Level Statements 在以往的代码里 ...

最新文章

  1. 最短路的那些有趣的模型(不定期更新)
  2. NOI2014 动物园
  3. python agg函数_Python Pandas Series.agg()用法及代码示例
  4. 每日一题(26)—— 无限循环的几种形式
  5. java 字节输出流_Java IO详解(三)------字节输入输出流
  6. 江小白包装设计原型_江小白果立方系列包装设计 获奖作品欣赏【工业设计作品集】...
  7. ulimit限制 新系统_graylog日志分析系统上手教程
  8. yii2GridView的简单使用
  9. SpringBoot多种自定义错误页面方式
  10. Xshell6 Xftp6 官方永久免费版下载
  11. 全球语种谱系图,看看机器翻译需要跨越的大山
  12. Bart模型应用实例及解析(二)————基于泰坦尼克号数据集的分类模型
  13. 订单管理系统(OMS)搭建实战 - 低代码拖拽定制订单管理系统
  14. 基于OpenCV DNN模块给黑白老照片上色(附Python/C++源码)
  15. CSS解构系列之-新浪页面解构-01
  16. 三大微分中值定理与两大积分中值定理
  17. 率土之滨鸿蒙团,【率土之滨】无需“垒实”也能鏖战全场!群吕布混编弓解析...
  18. List的remove()方法避坑
  19. 简单的博弈问题:牛羊吃草问题(递归解法-暴力解法)
  20. Windwos 搭建TFTP

热门文章

  1. zcmu-1930帽子戏法
  2. 目标检测之one-stage和two-stage网络的区别
  3. Java高级用户指南-核心Java
  4. 阿里云部署k8s集群
  5. Rust:生命周期标注(lifetime annotation)
  6. Python PySpark 大数据时代
  7. SY-REPID 和 SY-CPROG使用详解及其区别
  8. 泰坦尼克号 数据重构 + 可视化
  9. Dx bad class file magic (cafebabe) or version (0033.0000) 导致 NoClassDefFoundError 的问题
  10. 百度云直播的操作流程