`
qiemengdao
  • 浏览: 272906 次
  • 性别: Icon_minigender_1
  • 来自: 武汉
社区版块
存档分类
最新评论

汇编语言基础知识_寻址方式(转)

阅读更多
操作数采取哪一种寻址方式,会影响机器运行的速度和效率;也影响程序员的程序设计方法。
寻址方式(Addressing)通俗地讲就是寻找地址的方法。

这个地址可以是CPU内部的寄存器――寄存器寻址方式。(程序员以名称区别各个寄存器,但CPU则利用地址编码区别)
这个地址也可以是主存储器地址――存储器寻址方式。
这个地址还可以是I/O地址――I/O寻址方式。

地址指向的内容可以是程序需要操作的数据,即操作数地址――操作数寻址方式。
地址指向的内容可以是程序需要转向的指令,即目标地址――目标地址寻址方式。


--------------------------------------------------------------------------------


本节学习8086的操作数寻址方式,其他寻址方式在第2章陆续展开。
操作数寻址方式――寻找操作数的方法。

CPU可以直接将数据本身与指令一起编码作为指令代码的一部分,也可以存放在寄存器或主存储器中,这就对应立即数寻址、寄存器寻址和存储器寻址方式。又由于存储器地址有多种表示方法,于是又存在多种存储器寻址方式;8086支持的存储器寻址方式有:直接寻址、寄存器间接寻址、寄存器相对寻址、基址变址寻址、相对基址变址寻址方式。





8086CPU的机器代码(Machine Code,也称指令代码Instruction Code)一般格式:操作码占1个或2个字节,后面的各个字节指明操作数。其中,“mod reg r/m”字节表明寻找操作数的方式(即采用的寻址方式),“位移量”字节给出某些寻址方式需要的相对基地址的偏移量,“立即数”字节给出立即寻址方式需要的数值本身。操作数的各个字段有多种组合。

8086指令最多可以有两个操作数。在“mod reg r/m”字节中,reg字段表示一个采用寄存器寻址的操作数;reg占用3位,不同编码指示8个8位(w=0)或16位(w=1)通用寄存器之一。mod和r/m字段表示另一个操作数的寻址方式,分别占用2位和3位。

mod=00――无位移量的存储器寻址方式。但其中,当r/m=110时为直接寻址方式,此时该字节后跟16位有效地址D16。
mod=01――带有8位位移量的存储器寻址方式。此时该字节后跟1个字节量,表示8位位移量D8,它是一个有符号数。
mod=10――带有16位位移量的存储器寻址方式。此时该字节后跟2个字节(字)量,表示16位位移量D16,它也是一个有符号数。
mod=11――寄存器寻址方式,由r/m指定寄存器,r/m此时的编码与reg相同。


--------------------------------------------------------------------------------
除了上述一般机器代码格式外,8086CPU还有其它机器代码格式。
读者不能理解机器代码,没有关系,不会影响程序设计。现在,只要能够理解最常用的传送指令MOV功能:
    MOV dest,src     ;dest←src  
MOV指令的功能是将源操作数src传送至目的操作数dest。



在立即数寻址方式下,指令中的操作数就直接存放在机器代码中,紧跟在操作码之后。这条指令汇编成机器代码后,操作数作为指令的一部分存放在操作码之后的主存单元中。称这种操作数为立即数imm,它可以是8位数值i8(00H ~ FFH),也可以是16位数值i16(0000H ~ FFFFH)。
立即数寻址方式常用来给寄存器赋值。 


例:将16位立即数0102H送至AX寄存器
    MOV AX,0102H     ;AX←0102H
该指令机器代码为“B8 02 01”,其中B8为操作码,紧接着16位立即数0102H。注意高字节01H存放于高地址中,低字节存放于低地址单元中。



寄存器寻址方式的操作数存放在CPU的内部寄存器reg中,
它可以是8位寄存器r8:AH / AL / BH / BL / CH / CL / DH / DL;
也可以是16位寄存器r16:AX / BX / CX / DX / SI / DI / BP / SP。
另外,操作数还可以存放在4个段寄存器中seg:CS / DS / SS / ES。
寄存器寻址方式的操作数存放于CPU的某个内部寄存器中,不需要访问存储器,因而执行速度较快,是经常使用的方法。 


例:将寄存器AX的内容传送给BX寄存器保存
    MOV BX,AX     ;两个操作数均为寄存器寻址:BX←AX

如何寻址主存中存储的操作数就称为存储器寻址方式,也称为主存寻址方式:

主存寻址方式下,指令给出操作数的主存地址信息;
8086分段管理主存储器空间,主存地址在编程时采用逻辑地址;
逻辑地址由段地址和偏移地址组成;
主存寻址时,段地址在默认的或用段超越前缀指定的段寄存器中;
主存寻址时,偏移地址被称有效地址EA(Effective Address),需要指令指定。
为了方便各种数据结构的存取,根据有效地址的提供方法不同,8086设计了多种主存寻址方式:

直接寻址方式
寄存器间接寻址方式
寄存器相对寻址方式
基址变址寻址方式
相对基址变址寻址方式
指令中直接包含了有效地址。16位有效地址紧接着操作码,存放在代码段中。默认的段地址在DS段寄存器中,但可使用段超越前缀改变。
汇编语言的语法中,一般规定用中括号表达存储单元的内容。所以为了区别于16位立即数,书写汇编指令时要将16位有效地址加上中括号。 


例1:将数据段中偏移地址2000H的一个16位数据传送给AX
    MOV AX,[2000H]     ;AX←DS:[2000H],指令代码:A10020
该指令中给定了有效地址2000H,它还不是存储器的物理地址。默认情况下,有效地址要与数据段寄存器DS一起构成操作数所在存储单元的物理地址。

寄存器间接寻址方式中,有效地址存放在基址寄存器BX或变址寄存器SI、DI中。默认的段地址在DS段寄存器中,但可使用段超越前缀改变。

例:将数据段中由SI指定偏移地址的一个16位数据传送给AX
    MOV AX,[SI]     ;AX←DS:[SI]
该指令中有效地址存放于SI寄存器中,而操作数则存放在数据段主存单元中。假设SI内容设置为2000H,则该指令等同于MOV AX, [2000H]。

寄存器相对寻址方式下,有效地址是寄存器内容与有符号8位或16 位位移量之和,寄存器可以是BX、BP或SI、DI。其中采用BX、SI、DI寄存器则默认是数据段DS,采用BP 寄存器默认是堆栈段SS;当使用非默认段时,可用段超越前缀。

操作数的有效地址应该是:有效地址=BX / BP / SI / DI + 8 / 16位位移量

例:将数据段中由DI内容加上6作为偏移地址指向的一个16位数据传送给AX
    MOV AX,[DI+06H]     ;AX←DS:[DI+06H]
这条指令中使用的是DI寄存器,位移量为06H,那么操作数的有效地址EA=DI+06H,与DI寄存器约定的段是数据段是DS。

例:将堆栈段中由BP内容加上6作为偏移地址指向的一个16位数据传送给AX
    MOV AX,[BP+06H]     ;AX←SS:[BP+06H]
该指令使用的是BP寄存器,与之约定的段为堆栈段SS。

基址变址寻址方式是把一个基址寄存器(BX或BP)的内容加上变址寄存器(SI或DI)的内容构成有效地址EA。若基址寄存器使用BX,其默认段为数据段DS;若基址寄存器使用BP,其默认段为堆栈段SS。

操作数的有效地址EA为:有效地址=BX / BP + SI / DI

例:
    MOV AX,[BX+SI]        ;AX←DS:[BX+SI]
    MOV AX,[BP+DI]        ;AX←SS:[BP+DI]
    MOV AX,DS:[BP+DI]     ;AX←DS:[BP+DI]

相对基址变址寻址方式,也使用基址寄存器(BX / BP)和变址寄存器(SI / DI), 另外还在指令中指定一个8位或16位的位移量,这三者之和构成操作数的有效地址EA,与BX寄存器约定的段为数据段DS,与BP寄存器约定的段为堆栈段SS。

相对基址变址寻址方式的有效地址=BX / BP + SI / DI + 8 / 16位位移量

例:
    MOV AX,[BX+SI+06H]     ;AX←DS:[BX+SI+06H]

操作数寻址方式是汇编语言的重点和难点。请按如下思路学习:

1. 操作数可以存在什么地方?

⑴ 操作数存在于指令代码中,处理器译码时就立即获得了这个操作数,这就是立即(数)寻址方式。汇编指令中,这个立即数(操作数)以常量形式出现。

⑵ 操作数存在于处理器内部寄存器中,处理器从寄存器中获得这个操作数, 这就是寄存器寻址方式。汇编指令中,这个寄存器操作数以寄存器名形式出现。

⑶ 操作数存在于主存中,处理器从主存单元获得这个操作数,这就是存储器寻址方式。汇编指令中,这个存储器操作数以主存地址形式出现。

2. 8086/8088处理器的主存地址在程序设计时采用逻辑地址。
逻辑地址分成段地址和偏移地址两部分。

3. 存储器寻址方式表达存储器地址时,段地址在默认的或段超越前缀指令指定的段寄存器中,偏移地址被称为有效地址EA(Effective Address)。有效地址用中括号括起来。

4. 有多种获得偏移地址的方法,所以存储器寻址方式又分成多种寻址方式。

⑴ 有效地址直接给出,存在于指令代码中,就是直接寻址方式。

⑵ 有效地址存在寄存器中,就是通过寄存器的间接寻址方式。

⑶ 有效地址是两部分的和,一部分在寄存器中,另一部分直接给出(称为位移量),这就是寄存器相对寻址方式。

⑷ 有效地址是两部分的和,一部分在基址寄存器中(8086是BX和BP),另一部分在变址寄存器中(8086是SI和DI),这就是基址变址寻址方式。

⑸ 有效地址是三部分的和,第一部分在基址寄存器中(8086是BX和BP),第二部分在变址寄存器中(8086是SI和DI),第三部分直接给出(称为位移量),这就是相对基址变址寻址方式。

5. 区别各种寻址方式时,注意各自的特点。

只有一个常量,是立即(数)寻址方式;只有一个寄存器名,是寄存器寻址方式;其他则是存储器寻址方式。用中括号括起一个常量是直接寻址方式;用中括号括起一个寄存器名,是寄存器间接寻址方式;用中括号括起一个寄存器名和一个常量是寄存器相对寻址方式;用中括号括起两个寄存器名是基址变址寻址方式;用中括号括起两个寄存器名和一个常量是相对基址变址寻址方式。

6. 汇编语句中,还有其他形式出现,需要理解相应操作符才能做出正确判断。
例如,直接写出变量名实际上是直接寻址方式;变量名加减一个常量还是直接寻址方式;变量名和一个寄存器则是寄存器相对寻址方式;利用offset后跟一个变量名则是立即数寻址方式。




分享到:
评论

相关推荐

    汇编语言基础学习资料

     1.1 汇编语言的由来及其特点  1 机器语言  2 汇编语言  3 汇编程序  4 汇编语言的主要特点  5 汇编语言的使用领域  1.2 数据的表示和类型  1 数值数据的表示  2 非数值数据的表示  3 基本的数据类型 ...

    汇编语言基础教程 chm 电子版.rar

    汇编语言基础教程 chm 电子版,章节内容介绍: 第1章 预备知识 第2章 CPU资源和存储器 第3章 操作数的寻址方式 第4章 标识符和表达式 第5章 微机CPU的指令系统 第6章 程序的基本结构 第7章 子程序和库 第8章...

    《汇编语言程序设计》课件

    汇编语言程序设计 主 编 : 宋锦河 副主编 : 曾长军 李珍香  陈兴无 王泽生  主 审: 黄维通 《汇编语言程序设计》 第1章 基础知识 第2章 寻址方式和指令系统 第3章 宏汇编语言 第4章 程序设计方法 第5章 ...

    深入理解程序设计使用Linux汇编语言

    《深入理解程序设计:使用Linux汇编语言》介绍了Linux平台下的汇编语言编程,教你从计算机的角度看问题,从而了解汇编语言及计算机的工作方式,为成就自己的优秀程序员之梦夯实基础。 很多人都认为汇编语言晦涩难懂...

    汇编语言基础教程 汇编语言基础教程

     1.1 汇编语言的由来及其特点  1 机器语言  2 汇编语言  3 汇编程序  4 汇编语言的主要特点  5 汇编语言的使用领域  1.2 数据的表示和类型  1 数值数据的表示  2 非数值数据的表示  3 基本的数据类型 ...

    微型计算机汇编语言程序设计

    第3、4章介绍编程基础,包括指令系统、寻址方式、伪操作和汇编语言格式; 第5~8章介绍编程方法和技术,包括顺序、分支、循环和子程序等基本程序结构,宏汇编技术,中断与输入/输出程序设计方法,BIOS和DOS系统功能...

    汇编语言程序设计——从DOS到Windows(张雪兰)

    第1部分介绍Intel 80x86系列微处理器的基础知识、实模式汇编语言程序设计等,主要内容包括:预备知识、微处理器的基础知识、寻址方式及指令集、汇编语言程序组织、程序的基本结构及其程序设计、子程序与宏指令设计、...

    汇编语言及应用教程

    全书共8章,主要内容包括汇编语言基础知识、80X86的寻址方式与指令系统、汇编语言程序格式、汇编语言程序设计、高级汇编语言技术、DOS中断与BIOS中断、I/O程序设计、汇编语言典型应用编程实例等。本书内容充实、...

    清华大学计算机系教材-汇编语言程序设计

    第一、二章为基础知识,包括计算机中数和字符的表示方法,计算机的编程结构及工作方式等。第三章介绍指令系统和寻址方式。第四章介绍伪操作和汇编语言程序格式。第五、六章说明循环、分支、子程序结构和程序设计的...

    IBM-PC.rar_汇编语言_Visual_Basic_

    第一部分主要阐述和讨论了80X86汇编语言程序设计的基础知识。如;数据格式及其转换,8086CPU中寄存器的结构及使用,存储器的分段,指令和操作数的寻址方式,80X86的指令系统,汇编语言程序格式及伪指令,汇编语言...

    IBM-PC汇编语言程序设计(第2版)

    第3章和第4章为编程工具部分,主要内容为80X86的指令系统与寻址方式,以及包括伪操作在内的汇编语言程序格式;第5章-第9章说明编程方法,内容包括循环、分支、子程序等基本程序结构,程序设计的基本方法和技术,多...

    80 86汇编语言介绍

    第3、4章介绍编程工具,包括指令系统、寻址方式、伪操作和汇编语言格式;第5~9章和第13章讲述编程方法,包括循环、分支、子程序等基本程序结构,宏汇编技术,中断等输入输出程序设计方法,MIOS和DOS系统功能调用...

    汇编语言与程序设计的课后答案

    第一章基础知识 第二章8086计算机组织 第三章指令系统和寻址方式 第四章 汇编语言程序设计 第五章循环与分支程序设计 第六章 子程序设计 第七章 高级汇编语言设计 第八章输入输出程序设计 第九章 bios和dos中断 ...

    [80X86汇编语言程序设计].王元珍.文字版

    1.1 机器语言与汇编语言 1.1.1 机器语言 1.1.2 汇编语言 1.1.3 书中使用符号的说明 1.2 Intel系列机简介 1.2.1 Intel 80X86微处理器简介 1.2.2 Intel 80X86微处理器结构 1.2.3 80X86的3种工作方式 1.3 主...

    《汇编语言》-第三版-王爽-以及课后答案

    第1章 基础知识 1.1 机器语言 1.2 汇编语言的产生 1.3 汇编语言的组成 1.4 存储器 1.5 指令和数据 1.6 存储单元 1.7 CPU对存储器的读写 1.8 地址总线 1.9 数据总线 1.10 控制总线 1.11 内存地址空间(概述) 1.12 ...

    王爽著《汇编语言》课件及课后习题答案和实验解答

    第1章基础知识 1.1 机器语言 1.2 汇编语言的产生 1.3 汇编语言的组成 1.4 存储器 1.5 指令和数据 1.6 存储单元 1.7 CPU对存储器的读写 1.8 地址总线 1.9 数据总线 1.10 控制总线 1.11 内存地址空间(概述)...

    8086汇编语言

    第1章 计算机基础知识 第2章 寻址方式和指令系统 第3章 汇编语言 第4章 汇编语言程序设计的基本技术 第5章 子程序设计 第6章 高级汇编语言技术 第7章 输入输出与中断 附带asm源码

    零基础入门学习CE汇编教程.chm

    本教程就是讲解汇编语言的相关知识。 为什么叫CE汇编?那是因为本教程所讲解的内容都或多或少的与游戏修改有关,与游戏修改没有任何关系的汇编知识一概不 讲解。 为什么又叫“零基础”呢?那是因为即使是没有任何...

    汇编语言和debug用法

    汇编基础知识:debug 寻址 指令 标志位寄存器 过程设计 com文件格式等 dos windows 反汇编 单片机 中断 问题/回复

Global site tag (gtag.js) - Google Analytics