汇编语言讲义第三章 80x86的寻址方式
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
• 操作数包含在CPU的某一个内部寄存器中,
4.
5. 6. 7.
寄存器间接寻址方式
寄存器相对寻址方式 基址加变址寻址方式 相对基址加变址寻址方式
• 操作数在内存的数据区(存储器)中,
这时指令中的操作数字段包含着此操作
数的地址。8086/8088系统中的任何内存
地址是由两部分组成的,即段基地址和 偏移地址。为了适应要处理的各种数据
二、指令寻址方式:与转移地址有关的寻址方式
寻址方式:寻找数据和指令存放地址的方式。
• 微型计算机系统的每一条指令通常由操作码字段和操作数字段两部分组成 。
(1)操作码字段:指出进行什么操作。每条指令都有自己的操作码; (2)操作数字段:指出大多数指令涉及的操作数和操作结果放在何处。 ① 指出操作数的值为多少。 ② 指出放在什么地方。 ③ 指出操作结果送到哪里去。 • 三种类型的操作数: (1)立即数操作数:指令中直接给出数据,即立即数。 (2)寄存器操作数:操作数在寄存器中。 (3)存储器操作数:操作数在存储器(内存)中。可以是数据的地址,或其它 能间接获得操作数的信息。 • 操作数的设置情况: (1)有些指令需要一个操作数。例如:DEC AL (2)有些指令需要两个操作数。例如:MOV AX,BX ADD AX,BX (3)有些指令不需要操作数。 例如:HLT
有效地址:EA = 基址+(变址×比例因子)+位移量(X)
(1)位移量:是存放在指令中的一个8位、16位和32位的数,但它不是立即数,
而是一个地址。
(2)基址:是存放在基址寄存器中的内容。它通常用来访问数组中的某个元素
或字符串中的某个字符。
(3)变址:是存放在变址寄存器中的内容。它通常用来访问数组中的某个元素
CS
E9H? 6 00 30H 00H
…
… …
BX 40 00H
SS
20036H
00H 00H
… … …
6、基址加变址寻址方式:[BR][IR] • 操作数存放在存储器中。把一个基址寄存器BX或BP的内容,加上变址寄存器 SI或DI的内容,并以一个段寄存器作为地址基准,作为操作数的地址。 • 当基址寄存器为BX时,段寄存器使用DS; CS • 当基址寄存器为BP时,段寄存器用SS。
DS
20020H
89H 37H
… … … …
AX
00 00H
例13 MOV 6[BP],BX
; (BX)→(SS)×10H+(BP)+6
…
执行前:(BX)= 4000H,(BP)= 30H,
(SS)= 2000H,(20036H)= 0000H 执行后:(BX)= 4000H,(BP)= 30H, (SS)= 2000H,(20036H)= 4000H
MOV 18,AL ; 18←AL
执行后:(AL)= 12H
例2 MOV AX,2000H ; 2000H→AL 执行后:(AX)= 2000H
CS
E8H 00H 20H
… … … …
2、寄存器寻址方式:R
• 操作数包含于CPU的内部寄存器之中。寄存器名是操作数的符号地址,寄存器
的内容是指令所需的操作数。 例3 INC AX ;(AX)+1→AX
或字符串中的某个字符。
(4)比例因子:是386及其后继机型中新增加寻址方式中的一个术语,其值可为
1、2、4、8。在寻址中,可用变址寄存器的内容乘以比例因子来取得变址
值。这类寻址方式对访问长度为2、4、8字节的数组特别有用。
操作数字段指出操作结果送到哪里去。 有些指令需要两个操作数。
目的操作数,源操作数
DS
E9H? 00H 10H
21000H
59H 12H
… … … …
AX 11 22H
…
4、寄存器间接寻址方式:[R]
• 操作数在存储器中。操作数的有效地址由变址寄存器SI、DI或基址寄存器BX、
BP提供。
变址寻址方式
CS
…
• 如果指令中指定的寄存器是BX、SI、DI,
则用DS寄存器的内容作为段地址。
的内容左移四位与基址寄存器BP的内容相加形成,这是基本约定。
隐含段 段 约定的寄存器 主要用途
CS
SS DS ES
IP
SP,BP BX,SI,DI DI
指令寻址
堆栈寻址 数据寻址 目标串寻址
跨段问题:段的跨越
段 CS
约定的寄存器 IP SP,BP
主要用途 指令寻址 堆栈寻址
例如 MOV AX,DS:[BP]
00 45H
执行后:(AX)= 9988H,(BX)= 30H,
(SI)= 20H,(DS)= 1000H, ( 10050H)= 9988H
DS
10050H
88H 99H
… … …
例15 MOV [BP][DI],BX
MOV [BP+DI],BX
…
;(BX)→(SS)×10H+(BP)+(DI)
无论是段默认情况,还是跨段情况,操作数的物理地址均由系统自动计算。
隐含段:段地址和存放偏移地址的寄存器在组合上有一定的规则。
若操作数在当前数据段中,操作数的物理地址PA由数据段寄存器DS的 内容左移四位与地址寄存器SI或DI的内容相加形成; 若操作数在当前堆栈段中,则操作数的物理地址PA由堆栈段寄存器SS
例14 MOV AX,[BX][SI]
MOV AX,[BX+SI]
Fra Baidu bibliotek
E9H? 30H 00H 20H 00H
…
…
;((DS)×10H+(BX)+(SI) )→AX 执行前:(AX)= 45H,(BX)= 30H, (SI)= 20H,(DS)= 1000H, ( 10050H)= 9988H
… …
AX
结构的需要,这个段内偏移地址可以由
几个部分组成,把它称为有效地址EA。
1、立即寻址方式:n
• 所提供的操作数(立即数)紧跟在操作码的后面,与操作码一起放在指令代
码段中。
• 立即数可以是8位数或16位数。 • 只能用于源操作数字段,不能用于目的操作数字段,经常用于给寄存器赋初
值。 例1 MOV AL,18 ; 18→AL 以下为错误的指令:
执行前:(ES)= 3000H
执行后:(AX)= 5050H
CS
26H A2H 00H
20H
… … … …
AX
ES
32000H
50H 50H
… … …
跨段前缀
NEXT:
MOV
AL,
DS:[SI]
MOV
ES:[2000H], AL
跨段前缀
NEXT:
MOV MOV
AL,
DS:[SI]
ES:[DI], AL
操作数的偏移地址可以以变量的形式出现。在数据段中用伪指令DB(1个字
节)、DW(2个字节)、DD(4个字节)、DQ(8个字节)、DT(10个字节)
定义变量。
CS
… …
例9 MOV AX,BUFA
;((DS)×10H+1000H)→AX
执行前:假定BUFA在数据段中定义,EA=1000H, (DS)= 2000H,(AX)=1122H, (21000H)=1259H 执行后:(AX)= 1259H,(21000H)=1259H
DS
32000H
50H 50H
… … … … …
AX
跨段访问情况
•
8086的存储器是分段使用的,通常,若选用寄存器(BX、BP、SI和 DI) 做间接寄存器、变址寄存器或基址寄存器,只要有BP寄存器出现,操作数
就在当前的堆栈段。操作数的物理地址由堆栈段寄存器SS的内容左移4位
与偏移地址EA相加;
• •
执行前:(BX)= 3344H,(BP)= 10H, (DI)= 40H,(SS)= 4000H, ( 40050H)= 0000H 执行后:(BX)= 3344H,(BP)= 10H, (DI)= 40H,(SS)= 4000H, ( 40050H)= 3344H
CS
… …
(SS)= 2000H,(20030H)= 1234H
E9H? 30H
00H
…
…
AX 33 44H -
SS
20030H
34H 12H
… … …
5、寄存器相对寻址:X[R]
• 操作数存放在存储器中。以指定的寄存器内容,加上
…
指令中给出的位移量(8位或16位),并以一个段寄存 CS 器为基准,作为操作数的地址。
10020H
44H 33H
…
(DS)= 1000H,(10020H)= 3344H
…
例11 SUB AX,[BP]
; AX-((SS)×10H+(BP))→AX
执行前:(AX)= 3344H,(BP)= 30H,
(SS)= 2000H,(20030H)= 1234H 执行后:(AX)= 2110H,(BP)= 30H,
• 指定的寄存器一般是一个基址寄存器或变址寄存器。
E9H?
5 00 1BH 00H
… …
例12 MOV AX,5[BX] ;((DS)×10H+(BX)+5)→AX 执行前:(AX)= 0000H,(BX)= 1BH, (DS)= 2000H,(20020H)= 3789H 执行后:(AX)= 3789H,(BX)= 1BH, (DS)= 2000H,(20020H)= 3789H
否则,操作数在当前数据段,此时,操作数的物理地址由数据段寄存器DS
的内容左移4位与偏移地址EA相加形成。
这是8086的具体约定,即默认状态。当要否定默认状态,到非约定段寻址 操作数时,必须用跨段前缀指明操作数所在段的段寄存器名。
段寄存器名:偏移地址
功能:冒号“:”之前的段寄存器指明了操作数所在段。
•
起放在代码段,而操作数则在数据段中。操作数的地址是数据段寄存器DS中
…
的内容左移4位后,加上指令给定的16位地址偏移量。
• 默认段为数据段。
CS
例7 MOV AX,[2000H] ;((DS)×10H+2000H)→AX
A1H 00H 20H
…
执行前:(DS)= 3000H
执行后:(AX)= 5050H
SS
MOV BX,ES:[BX]
MOV CX,SS:[SI]
DS ES
BX,SI,DI DI
数据寻址 目标串寻址
MOV DX,SS:[DI]
MOV AX,ES:[2000H] 默认状态不起作用,操作数的物理地址由“:”前面的段寄存器内容左移4位 与EA相加形成。
例8 MOV AX,ES:[2000H] ;((ES)×10H+2000H)→AX
第3章 寻址方式
一、数据寻址方式:与数据有关的寻址方式
(1)16位寻址:操作数的偏移地址由16位二进制数组成,段地址保存在CS、
DS、ES、SS中,20位物理地址是由段基地址加上操作数的偏移地址形成的,最 大寻址空间为1MB。 (2)32位寻址:32位微处理器在保护模式下的一种寻址方式,需要提供32位 偏移地址。80x86从386起就把机器字长从16位增加在32位,相应的16位寄存器 也扩展为32位寄存器( EAX、EBX、ECX、EDX、ESP、EBP、EDI、ESI)。兼容 了16位寻址。在实模式下,这两种寻址方式可同时使用,但段的大小被限制在 64KB之内。8086、80286不支持32位寻址方式。
执行前:(AX)= 1234H,(BX)= 5620H
执行后:(AX)= 6854H,(BX)= 5620H 例6 MOV AX,BX ; (BX)→AX
执行前:(AX)= 6789H,(BX)= 0000H
执行后:(AX)= 0000H,(BX)= 0000H
3、直接寻址方式:[n]
• 操作数在存储器中。操作数的偏移地址直接包含在指令中,和指令操作码一
例 MOV AX,BX 例 ADD AX,BX
;(BX)→AX ;(AX)+(BX)→AX
例 SUB AX,BX
;(AX)-(BX)→AX
与数据有关的寻址方式
寻址方式可能有三种情况:
16位寻址
1. 2. 3. 立即寻址方式 寄存器寻址方式 直接寻址方式
• 操作数包含在指令中,即指令的操作数
字段就包含着操作数本身。这种寻址方 式称为立即寻址,这种操作数就称为立 即数。 这时指令中的操作数字段是CPU内部寄存 器的一个编码,这种寻址方式称为寄存 器寻址。
执行前:(AX)= 3344H
执行后:(AX)= 3345H 例4 DEC CX ;(CX)-1→CX
执行前:(CX)= 78H
执行后:(CX)= 77H 例5 ADD AX,BX ;(AX)+(BX)→AX 以下为错误的指令: 例 MOV AL,256 例 MOV AX,20000H 例 MOV AL,BX
…
• 如指令中用BP寄存器,
则操作数的段地址在SS中,即堆栈段。
E9H? 20H
00H
…
基址寻址方式
例10 ADD AX,[SI] ; AX+((DS)×10H+(SI))→AX
DS
… …
AX 11 22H + +
执行前:(AX)= 1122H,(SI)= 20H,
(DS)= 1000H,(10020H)= 3344H 执行后:(AX)= 4466H,(SI)= 20H,