? 指令系统 一组指令的集合
第三章 80x86的指令系统和寻址方式
操作码 操作数,.,操作数 指令,
? 寻址方式
与 数据 有关的寻址方式
与 转移地址 有关的寻址方式
1,8086 的寻址方式
与 数据 有关的寻址方式,
? 立即寻址 MOV AX,3069H
? 寄存器寻址 MOV AL,BH
? 直接寻址 MOV AX,[ 2000H ]
? 寄存器间接寻址 MOV AX,[ BX ]
? 寄存器相对寻址 MOV AX,COUNT [ SI ]
? 基址变址寻址 MOV AX,[ BP ] [ DI ]
? 相对基址变址寻址 MOV AX,MASK [ BX ] [ SI ]
存储器寻址
(1) 立即寻址方式 * —— 操作数在指令中给出
MOV AL,5
MOV AX,3064H
MOV AL,‘A’
* 只能用于 SRC 字段
* SRC 和 DST 的字长一致 MOV AH,3064H ?
(2) 寄存器寻址方式 * —— 操作数在指定的寄存器中
MOV AX,BX
MOV AL,BH
MOV AX,3064H
* 字节寄存器只有 AH AL BH BL CH CL DH DL
* SRC 和 DST 的字长一致 MOV AH,BX ?
* CS 不能用 MOV 指令改变 MOV CS,AX ?
(3) 直接寻址方式 * —— 有效地址 EA 由指令直接给出
例,MOV AX,[ 2000H ]
EA = 2000H,假设 (DS) = 3000H,那么 PA = 32000H
* 隐含的段为数据段 DS
* 可使用 段跨越前缀 MOV AX,ES,[ 2000H ]
* 操作数地址可由变量(符号地址)表示
VALUE DB 10
MOV AH,VALUE
MOV AX,VALUE ?
MOV AX,WORD PTR VALUE ?
50H
30H
32000
AH AL
30 50
(AX) = 3050H
(4) 寄存器间接寻址 * —— EA 在基址寄存器 ( BX / BP )
或变址寄存器 ( SI / DI ) 中
MOV AX,[ BX ] PA = 16d ? ( DS ) + ( BX )
MOV AX,ES,[ BX ] PA = 16d ? ( ES ) + ( BX )
MOV AX,[ BP ] PA = 16d ? ( SS ) + ( BP )
* 不允许使用 AX,CX,DX 存放 EA
MOV AX,[ CX ] ?
* SRC 和 DST 的字长一致
MOV DL,[ BX ] ; [ BX ] 指示一个字节单元
MOV DX,[ BX ] ; [ BX ] 指示一个字单元
* 适于数组、字符串、表格的处理
有效地址 =
( BX )
( BP ) 8 位
( SI ) 16 位
( DI )
+ 位移量
(5) 寄存器相对寻址方式 *
例,MOV AX,COUNT [ SI ] 或 MOV AX,[ COUNT + SI ]
假设 ( DS ) = 3000H,( SI ) = 2000H,COUNT = 100H,
那么 PA = 32100H
假设 ( 32100H ) = 1234H,那么 ( AX ) = 1234H
* 适于数组、字符串、表格的处理
(6) 基址变址寻址方式 *
MOV AX,[ BX ] [ DI ]
或 MOV AX,[ BX + DI ]
MOV AX,ES,[ BX ] [ SI ]
* 适于数组、字符串、表格的处理
* 必须是一个基址寄存器和一个变址寄存器的组合
MOV AX,[ BX ] [ BP ] ?
MOV AX,[ SI ] [ DI ] ?
有效地址 =
( BX ) ( SI )
( BP ) ( DI ) +
(7) 相对基址变址寻址方式
MOV AX,MASK [ BX ] [ SI ]
或 MOV AX,MASK [ BX + SI ]
或 MOV AX,[ MASK + BX + SI ]
有效地址 =
( BX ) ( SI ) 8位
( BP ) ( DI ) 16位 + +
位移量
访问存储器的方式 默认的 段寄存器 可跨越的 段寄存器 偏移地址
取指令 CS 无 IP
堆栈操作 SS 无 SP
一般数据访问 DS CS ES SS 有效地址 EA
BP 作为基址的寻址 SS CS DS ES BP
串操作的源操作数 DS CS ES SS SI
串操作的目的操作数 ES 无 DI
段 寄 存 器 的 使 用 规 定
例:编写一段显示字符串 string 的程序
data segment
string db ‘happy new year!’,0dh,0ah,‘$’
count dw 17
data ends
(1) 直接寻址
mov dl,string
mov ah,2
int 21h ; 显示字符 ‘ h’
mov dl,string+1
mov ah,2
int 21h ; 显示字符 ‘ a’
…..,
(2) 寄存器间接寻址
mov cx,count ; mov cx,17
mov bx,offset string ; string 的偏址 ? bx
next,
mov dl,[ bx ]
mov ah,2
int 21h ; 显示一个字符
inc bx
loop next ; 循环指令
(3) 寄存器相对寻址
mov cx,count ; mov cx,17
mov si,0
next,
mov dl,string [ si ] ; mov dl,[ string + si ]
mov ah,2
int 21h ; 显示一个字符
inc si
loop next ; 循环指令
(4) 基址变址寻址
mov cx,count ; mov cx,17
mov bx,offset string ; string 的偏址 ? bx
mov si,0
next,
mov dl,[ bx ] [ si ] ; mov dl,[ bx + si ]
mov ah,2
int 21h ; 显示一个字符
inc si
loop next ; 循环指令
(5) DOS 显示字符串功能
mov dx,offset string ; string 的偏址 ? dx; lea dx,string
mov ah,9
int 21h ; 显示一串字符
80x86 新增的寻址方式
EA = (基址寄存器 ) + (变址寄存器 ) ? 比例因子 + 位移量
(1) 比例变址寻址方式
例,MOV EAX,COUNT [ ESI ? 4 ]
(2) 基址比例变址寻址方式
例,MOV ECX,[ EAX ] [ EDI ? 4 ]
(3) 相对基址比例变址寻址方式
例,MOV EAX,TABLE [ EBP ] [ EDI ? 4 ]
与 转移地址 有关的寻址方式,
? 段内 寻址
段内直接寻址 JMP NEAR PTR NEXT
段内间接寻址 JMP TABLE [ BX ]
? 段间 寻址
段间直接寻址 JMP FAR PTR NEXT
段间间接寻址 JMP DWORD PTR [ BX ]
用来确定 转移指令 及 CALL 指令 的转向地址。
(1) 段内直接寻址
转向的有效地址 = 当前 ( IP ) + 位移量 ( 8bit / 16bit )
例,JMP NEAR PTR NEXT 近转移 -32768 ~ +32767
JMP SHORT NEXT 短转移 -128 ~ +127
(2) 段内间接寻址
转向的有效地址 是一个寄存器或存储单元的内容。
( 可用除立即数以外的任何一种数据寻址方式得到 )
例,(BX) = 1256H (SI) = 528EH TABLE = 20A2H
(DS) = 2000H (232F8H) = 3280H (264E4H) = 2450H
JMP BX ; (IP) = 1256H
JMP TABLE [ BX ]
JMP WORD PTR TABLE [ BX ] ; (IP) = 3280H
JMP [ BX ] [ SI ]
JMP WORD PTR [ BX ] [ SI ] ; (IP) = 2450H
code1 segment
……
jmp far ptr next
……
code1 ends
code2 segment
……
next,
…..,
……
code2 ends
(3) 段间直接寻址
用指令中提供的 转向段地址 和 偏移地址 取代 CS 和 IP 。
例,
(4) 段间间接寻址
用存储器中的两个相继字的内容取代 CS 和 IP 。
( 存储单元的地址可用除立即数和寄存器以外的任何一种数据
寻址方式得到 )
例,JMP DWORD PTR [ INTERS + BX ]
作业,
p107 3.1 3.3 3.5 3.7 3.11