汇编学习笔记(2)-80x86寻址方式

寻址方式

  所谓寻址方式就是表示指令中数据所在地址的方式。一共有七种寻址方案

    立即数寻址

    寄存器寻址

    直接寻址

    寄存器间接寻址

    寄存器相对选址

    基址变质寻址

    相对基址变质寻址

在此之前,先介绍一个数据复制指令 MOV 指令, 格式是 MOV AX, BX 。 AXBX是寄存器上一章介绍过的MOV就是指令。 指令的含义就是将BX的值复制给AX。C语言的表述就是AX=BX;

  举个例子 如果一开始 AX=5; BX=0;

  MOV AX,BX 之后 AX = BX 都是0;

立即数寻址 / 寄存器寻址

  MOV AX, 1  ; AX = 1

  立即数寻址,我觉得称不上寻址,因为他给出的不是地址,而就是实际的数字,上面的命令中 1 就是立即数,而AX就是寄存器寻址所以寄存器寻址就是直接使用寄存器,数据直接存入指定的寄存器

  寄存器寻址可以使用的寄存器是AX(AL AH) BX(BL BH) CX(CL CH) DX(DL DH) SI DI SP BP等, 这些寄存器可以任意组合,举例如下

  MOV AX, BX  ; AX = BX

  MOV BX, AX  ; BX =AX

  MOV SI, DI  ; SI = DI

  MOV DI, SI  ; DI = SI

  这两种寻址方式是不涉及内存的操作的,所以速度是最快的,所以为了性能考虑应该尽量多的使用这两种寻址方式的操作。

  注意: MOV 1, AX 是非法的,应为1就是常数,你不能给常数赋值

直接寻址

  MOV AX, [1234H]

  MOV AX, ES:[1234H]

  直接寻址就是直接给出内存地址的寻址方式,格式是 段寄存器:[偏移地址] 偏移地址是立即数,用[]括起来。当然也可以直接省去前面的段寄存器写作 [偏移地址],这样汇编会自动选择一个默认的段地址,一般来说是DS段寄存器前面讲过内存地址是 段地址X16+偏移地址,所以使用段寄存器:[偏移地址] 给出的地址就是 段寄存器的值X16 + 偏移地址,

  举例

  MOV AX, DS:[1234H]

  这句话的就是将DSx16+1234H处的数据复制给AX寄存器,假设DS=5000H 那么就是将内存51234处的数据复制给AX,具体是多少就要看当时内存中是什么数据了。

  MOV AX, ES:[1234H]

  就是显示指定了使用的ES段寄存器,所以就是将ESx16+1234H处的数据复制给AX

  注意   ":"前面只能跟着段寄存器 DS ES SS CS寄存器

  这一条寻址方式其实是最基础的寻址方式,接下来的其他几种寻址方式都是只是[]偏移地址的表示方式发生了一些变化而已。

寄存器间接寻址

  MOV AX, [BX]

  MOV AX,CS:[BX]

  本质上和直接寻址是没太大区别的,唯一的区别就是在直接寻之中[]中的数据是直接给出的,但是在寄存器间接寻址中这个数字是存储在寄存器中而已。

  这里有个限制就是[] 中能使用的寄存器只有 BX BP SI DI ,如果使用的是BX SI DI则默认的段寄存器是DS,如果是BP寄存器则默认使用SS寄存器。

  当然如果特意指定寄存器那么就用指定的寄存器。

  举例 AX =1 BX = 1111H DS = 5000H

  MOV AX, [BX] ; 等于MOV AX,DS:[1111H] 就是将51111H内存出的数据复制到AX

寄存器间接寻址

  MOV AX, [BX + 1111H]

  在寄存器间接寻址的基础上加上立即数其他规则还是和寄存器间接寻址一样的

  举例 AX =1 BX = 2222H DS=5000H

  MOV AX, [BX + 1111H] ; 等于 MOV AX, DS:[2222H + 1111H] => MOV AX, DS:[3333H]

基址变址寻址

  MOV AX,[BX+SI]

  基址变址寻址就是用了两个寄存器 {BX/BP}+{SI/DI}, 如果是出现BP寄存器则默认使用SS寄存器,否则默认使用DS寄存器.规则和寄存器间接寻址也是一样的。

  要注意的是这里分为两组了寄存器 BX/BPSI/DI,一组中只能出现一个,即不能出现[ BX+BP ][SI+DI],从名字中就可以看出的 基址+变址,

    BX 基地址寄存器

    BP 基址指针寄存器(Base Point)

    SI 源地址寄存器(Source Index)

    DI 目的地址寄存器(Destination Index)

  举例 AX =1 BX=1111H SI=2222H DS= 5000H

  MOV AX,[BX+SI]; 等于 MOV AX, DS:[BX+SI] => MOV AX, DS:[1111H+2222H] => MOV AX, DS:[3333H]

相对基址变址寻址

   MOV AX,[BX+SI+4444H]

   可以看出就是在基址变址寻址的基础上加上了立即数其他规则不变

 举例 AX =1 BX=1111H SI=2222H DS= 5000H

  MOV AX,[BX+SI+4444H]; 等于 MOV AX, DS:[BX+SI+4444H] => MOV AX, DS:[1111H+2222H+4444H] => MOV AX, DS:[7777H]

总结:

  在我看来其实就三种寻址方式

  1. 立即数寻址 MOV AX, 1    直接给出数据

  2. 寄存器寻址 MOV AX, BX    地址是寄存器

  3. 内存寻址  MOV AX, 段寄存器 : [地址]  

  地址使用 [] 括起来,[] 中的结果就是数据在内存中的偏移地址,[] 可以使用两组寄存器 (BX/BPSI/DI) 和 立即数的任意组合,同组寄存器不能同时出现,段寄存器如果不指定则如果出现了BP寄存器就默认使用SS段寄存器否则默认使用DS寄存器

    寄存器间接寻址  = [ 只用一个寄存器]

    寄存器相对选址 = [用一个寄存器+立即数]

    基址变质寻址 = [用两个寄存器]

    相对基址变质寻址 = [用两个寄存器+立即数]

    写个公式就是 [地址] = [  {BX | BP | 空} + {SI | DI | 空} + {立即数 | 空}  ]

  其实这些寻址方式在使用汇编写代码的时候都是有对应的使用场景的,这个在以后会介绍的。

时间: 2024-12-18 01:40:02

汇编学习笔记(2)-80x86寻址方式的相关文章

汇编学习笔记(3)-80x86指令集

前言 (1)指令的一般格式 [标号:] 助记符 [操作数1 , [操作数2]] [; 注释] 一行一条指令 助记符就是指令的名称,每条指定必定有个助记符. 助记符前面的标号是给汇编编译器看的,由我们自己取名,一般取表示本段功能的相关的名字,对编译器而言表示的是指令的地址. 每个指令根据指令作用的不同会带有一个或者两个操作数,如果有两个操作数,则操作数中间用  逗号","  隔开. ;之后到本行结束为注释 是写个我们自己看的内容,用于描述指令的功能,方便理解程序功能.编译器会将注释内容直

AT&T汇编学习笔记

AT&T汇编和intel汇编的区别 (1)在Intel格式中大多使用大写字母,而在AT&T格式中都是用小写字母. (2)在AT&T格式中,寄存器名要加上"%"作为前缀,而在intel格式中则不带前缀. (3)在AT&T的386汇编语言中,指令的源操作数与目标操作数的顺序与在intel的386汇编语言中正好相反.在intel格式中是目标在前,源在后:而在AT&T格式中则是源在前,目标在后.例如,将寄存器eax的内容送入ebx,在intel格式中为&

AT&T汇编学习笔记(一)

file命令使用介绍 file最常用的场景就是用来查看可执行文件的运行环境,是arm呢,还是x86呢,还是mips呢?一看便知 $ file a.out a.out: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.24, BuildID[sha1]=0xa240b1958136fc294a6ee5833de2a0fc8c9e

汇编学习笔记-序章

最近突然对汇编语言开始感兴趣,于是说干就干了. 之前也自学过一点汇编,是跟着王爽老师的<汇编语言(第3版) >这本书学习的,已经是有5 6前年的样子了.当时觉得这本书写的非常通俗易懂是一本非常好的启蒙书籍,但是最近在翻阅的时候却觉得这本书知识点介绍的非常杂乱没有个章程,感觉像是没组织过一样想到哪里写到哪里.哈哈,个人愚见,王爽老师的粉丝不要喷我. 于是乎我去各种百度汇编学习的书籍推荐,在知乎.csdn找到了好几本推荐的书,然后就一股脑买了4本.所以我简单的根据书名排了个阅读顺序: 80x86汇

汇编学习笔记03(寄存器内存访问)

1. 字在内存中存储时, 要有两个地址连续的内存单元来存放. 字的低位字节存放在低地址单元中, 高位字节存放在高地址单元中. 2. DS: 存放段地址的寄存器, 这个段是存放数据的. [address]: 偏移地址 mov指令在访问内存单元时, 只给出偏移地址, 段地址默认在DS段寄存器中 3. mov ax, 1000 mov ds, ax 8086CPU不支持将数据直接送入段寄存器, 所以只能通过通用寄存器来进行中转. 4. 字的传送 80806CPU是16位结构, 有16根数据线, 所以一

Freescale MC9S08AW60汇编学习笔记(五)

前面学习了查表的功能,可以用查表的功能实现不少强大的功能,如查立方表.平方表.函数表.数码管显示的段码表等.这里还有一种由查表和转移指令配合使用而实现的一种强大的功能:散转.散转是指根据输入数据的不同来跳转到不同的程序入口进行处理,也就是说如果有多个子程序,我们不仅可以让它们按顺序一个个执行,还可以根据做判断用的数据的值来决定跳转到哪一个子程序.实现散转的具体做法是:在程序中定义一块连续存储单元作为跳转表,表中顺序存放各分支处理程序的跳转地址.各跳转地址在表中的偏移地址等于跳转表首地址加上它们各

汇编学习笔记---(2)基础知识

今天,接着上次,继续学习汇编语言,主要对内存地址空间.主板.接卡口.存储芯片等进行了解. 什么是内存地址空间? 要搞清楚这个问题,我们首先要知道主板和接口卡. 每个PC都会有一个主板,主板上附有核心器件,包括CPU.存储器.外围芯片组.扩展插槽等,它们通过地址总线+数据总线+控制总线相连. 接口卡啥作用,说白了就是通过总线接收CPU发送的命令,对显示器.音响等外部设备进行控制. 一台PC中主要有两种存储器:随机存储器RAM和只读存储器ROM. RAM中用于存放CPU使用的绝大部分程序和数据,PC

汇编学习笔记02(寄存器CPU工作原理)

1. 什么是寄存器呢? 就是可以用指令进行读写的部件. 程序员通过改变各种寄存器中的内容实现对CPU的控制. 如果是16位CPU的话, 就是相当于2个存储单元. 2. 字在寄存器中的存储? 8086CPU可以一次性处理两种尺寸的数据 Byte: 字节型数据, 一个字节由8个bit组成, 可以存在8位寄存器中. Word: 字型数据, 一个字型由16个bit组成, 也就是两个字节, 称为这个字的高位字节和低位字节. 3. 常用汇编指令的学习(需要注意的是汇编指令是不区分大小写的) mov ax,

汇编学习笔记01(基础知识)

自己在学习C语言的时候, 有的时候碰到自己理解不了的技术点的话, 就无从下手了, 但是这些技术点如果用汇编来理解的话, 可能非常好理解, 也更容易让大家理解, 所以感觉汇编是很强大的, 对我们学习一些其它的高级语言也很有用, 所以希望自己可以对伟大的汇编语言有一定的了解和认知, 对计算机的思维方式也有更进一步的认识, 对自己的编码习惯有一个好的影响或者改变, 同时对自己的能力有些提高吧. 1. 我们首先要知道什么是机器语言? 也就是机器指令的集合, 机器指令也就是一台机器可以正确执行的命令. 机