汇编语言程序设计 3-1
段地址规则
BX, SI, DI (DS) BP (SS)
寄存器相对寻址方式(register relative)
指令中指定地址寄存器(SI、DI、BX、BP)
与一个位移量相加作为内存操作数的偏移地址
(BX)
偏移地址 =
(BP)
(SI) (DI)
8位
+ 16位
位移量
MOV AX, [SI+2] MOV [BP-6H], AL
函数调用:断点和局部变量,参数的 保存
PUSH指令
格式:PUSH Src PUSH reg16/seg/mem16/ reg32/mem32 PUSH im ; 286新增 功能:
16位:(SP)-2 SP,(Src) SS:SP 32位: (SP)-4 SP,(Src) SS:SP Im?
Notice!
必须是字或双字操作: PUSH AL (?) 对于PUSH im
若是 8位数,则零扩展为16位 若大于16位数,则零扩展为32位 若是负十进制数,则2n-|x| 使用PUSHW、 PUSHD 使用WORD PTR(字)或DWORD PTR(双字) 操作符 PUSH WORD PTR [1000H] 或PUSHW、 PUSHD PUSHW [1000H]
执行操作:将源操作数src复制到目的操作数dest,
src不变。
Notice!
目的操作数Dst不能为im,IP,CS 大小要匹配 MOV DL, AX Mem<——>Mem Mov [1000H], [2000H] 两个段寄存器之间不能直接传送数据;立即数/
内存数不能直接送入段寄存器中;只有通用寄 存器Seg。
MOV CS/IP, AX (X)
3.内存操作数寻址方式
直接寻址方式(direct addressing)
寄存器间接寻址方式(register indirect)
寄存器相对寻址方式(register relative)
基址变址寻址方式(based indexed..) 相对基址变址方式(relative based indexed..)
汇编语言程序设计 Assembly Language Programming 第三章 80x86指令系统
3.1 指令格式
指令的一般格式
【标号:】
操作码
操作数1
操作数2 【;注释】
操作码说明计算机要执行哪种操作,
它是指令中不可缺少的组成部分 操作数是指令执行的参与者,即各种 操作的对象,为数据及数据所在地址。
数据在传送过程中不发生任何变化 对标志寄存器的内容无任何影响 数据传送的Copy性质。
MOV/XCHG/LEA,LDS,LES/PUSH,POP, PUSHF ,POP
/XLAT/LAHF,SAHF,CBW,CWD
扩展汇编指令
MOV指令
格式:MOV Dst, Src
MOV
reg/mem/seg, reg/mem/seg/imm
比较2 MOV AX, 1000H AX=1000H; MOV AX, [1000H] AX=1234H
AX AH AL ……
34 12
1000H 1001H
……
寄存器间接寻址方式(register indirect)
指定某个地址寄存器(SI、DI、BX、BP)
的内容作为内存操作数的偏移地址 MOV AX, [BX] MOV [BP], AL 使用场合:表格、字符串、缓冲区处理 注意:
seg
— 段寄存器CS/DS/SS/ES/FS/GS
汇编指令学习时应注意的问题
寻址方式的多样性
对标志寄存器的影响
两个操作数大小匹配原则
隐式匹配:两者之中有一个确定即可,CPU
自动匹配
不确定操作数:im,Mem(变量确定!)
1. 数据传送指令
特点
MOV AX, 0034H
注意:
只能用于源操作数
;机器码:B83400
使用场合:常数,8位和16位。
2. 寄存器寻址方式(register addressing)
操作数在指定的数据寄存器中
MOV AX, BX
MOV AL, BH
注意:
无FS和GS CS/IP不能用作目的操作数:
5. Notice!
操作数中使用变量的地方可均使用
“变量名+(-)整数表达式”的形式。
MOV
AX,X+2 这里的“+”不是汇编指令
偏移地址只能是16位,超过16位,则忽略
若BX=0XFFFF,DI=1,则[BX+DI+2]=2
两个操作数不能同时为内存
例 子
MOV BX,2000H
LES指令
格式:LES Dst, Mem32
说明:Dst——16位地址寄存器 功能: Mem32的低字Dst, Mem32的高字ES
例如: LES SI, [1000H]
LES SI, ExtraDATA
LFS、LGS、LSS指令
格式:LFS(LGS/LSS) Dst, Mem32
MOV DS,ES MOV SS, 3456H MOV ES, [1000H] MOV AX, 1234H MOV DS,AX
XCHG
格式:XCHG OPRD1, OPRD2
XCHG
reg/mem, reg/mem
执行操作:(OPRD1) (OPRD2)
Notice!
不允许使用段寄存器、IP 不能同时为mem 类型要匹配
3.2.2 32CPU扩展寻址方式
立即数: 32位立即数。
寄存器操作数: 8个32位通用寄存器以及FS和GS
内存寻址
寄存器间接寻址和寄存器相对寻址 基址变址寻址和相对基址变址寻址方式 带比例因子的内存寻址
内存寻址
[base]
disp[base] [base][index] disp[base][index] [index*n]
说明: base、index为任一32位通用 寄存器(index不能取ESP)。 n为比例因子,取1、2、4或8。 若包含base且base为EBP或ESP, 则隐含段地址在SS;否则,隐含 段地址在DS。 若在16位CPU上编程,则不能 使用这些寻址方式。 Base和index的区分:有比例因 子的是变址;仅一个的是基址; 第一个是基址,除非ESP在第二 个。
MOV SI , 0002H MOV DI, 2002H MOV AL,[2002H] MOV AL,[DI]
2000H 2001H 2002H 01H 01H 01H BX SI DI
2000H 0002H 2002H
MOV AL,[BX+0002H]
MOV AL,[BX+SI]
MOV AL,[BX+DI-2000H]
3.1 指令格式
操作数的形式
立即操作数:指令的操作数是立即数(常
量),只能是源操作数。 寄存器操作数:操作数存放在寄存器中值, 指令中使用寄存器名。 内存操作数:操作数存放在内存中,指令中 给出内存地址,通常为有效地址EA,段地 址在某个段寄存器中。
3.2 寻址方式
寻址方式(addressing mode)——是指在指令中
5. Notice!
变量名编译后用偏移地址代替
MOV
AL, X
MOV AL,[0001H]
在寄存器相对寻址和相对基址寻址中,位移
量可以是常量或变量,若是变量,则为偏移 地址。
MOV
AL, X[BX]
MOV AL,[0001H+BX]
内存操作数可以有多种写法: [BX+DI+2] 2[BX+DI] 2[BX][DI]
dst src oprdn — 目的操作数 — 源操作数 — 第n个操作数,如oprd1, oprd2, oprd3 mem8 mem16 mem32 — 8位内存操作数 — 16位内存操作数 — 32位内存操作数
mem
mem64 imm8
— mem8/mem16/mem32
— 64位内存操作数 — 8位立即数
例:
XCHG BX, [BP+SI] XCHG AL, BH XCHG [1000H],AL XCHG [1000H] , [2000H] MOV AX , [2000H] XCHG [1000H] , AX MOV [2000H],AX
地址传送指令LEA
格式:LEA Dst, Src
功能:DstSrc的偏移地址
reg8 — 8 位 通 用 寄 存 器 AH/AL/BH/BL/ CH/CL/DH/DL reg16 — /SI/DI/BP/SP 16 位 通 用 寄 存 器 AX/BX/CX/DX
imm16
imm32 im
— 16位立即数
— 32位立即数 — imm8/imm16/imm32
reg32 —32 位 通 用 寄 存 器 EAX/EBX/ECX/EDX /ESI /EDI/EBP/ESP reg — reg8/reg16/reg32
直接寻址方式(direct addressing)
内存操作数的偏移地址由指令直接给出
MOV AX, [2000H]
MOV WORD PTR [1000H], -1
MOV AX, Y
注意:
隐含的段为数据段 物理地址
DS
= 16 * (DS) +偏移地址
比 较
比较1 MOV AL, [1000H] AL=34H; MOV AX, [1000H] AX=1234H