320 likes | 488 Views
第三章 Pentium 微处理器的指令系统. 3.1 概述 3.2 Pentium 微处理器的寻址方式 3.3 数据传送指令 3.4 算术运算指令 3.5 逻辑运算指令 3.6 串操作指令 3.7 程序控制指令 3.8 保护模式的系统控制指令 3.9 浮点运算指令 3.10 MMX 指令简介. 3.1 概述. 指令是微处理器执行某种操作的命令,微处理器全部指令的集合称为指令系统。 指令有两种书写格式:机器指令和符号指令。 符号指令是用规定的助记符和规定的书写格式书写的指令。符号指令的书写格式为: 操作码助记符 操作数助记符
E N D
第三章 Pentium微处理器的指令系统 3.1 概述 3.2 Pentium微处理器的寻址方式 3.3 数据传送指令 3.4 算术运算指令 3.5 逻辑运算指令 3.6 串操作指令 3.7 程序控制指令 3.8 保护模式的系统控制指令 3.9 浮点运算指令 3.10 MMX指令简介
3.1 概述 • 指令是微处理器执行某种操作的命令,微处理器全部指令的集合称为指令系统。 • 指令有两种书写格式:机器指令和符号指令。 • 符号指令是用规定的助记符和规定的书写格式书写的指令。符号指令的书写格式为: • 操作码助记符 操作数助记符 • MOV AL, 1 • 10110000 00000001
3.2 Pentium微处理器的寻址方式 • 寻址方式:寻找指令中操作数地址的方式。 • 操作数有三种可能的存放方式: • 直接包含在指令中 • 立即数 • 立即数寻址 • 包含在某个寄存器中 • 寄存器操作数 • 寄存器寻址 • 在内存中 • 存储器操作数(内存操作数) • 存储器寻址
内存实际地址由两部分组成:存储单元所在段的基地址/段内偏移地址(偏移量)内存实际地址由两部分组成:存储单元所在段的基地址/段内偏移地址(偏移量) • MOV ES:[3000H], AL • 段内偏移地址可以由如下四个部分组成(称为偏移地址四元素): • 基址寄存器内容 • 变址寄存器内容 • 比例因子 • 位移量
由四元素组合形成的偏移地址称为有效地址EA: • EA=基址+(变址比例因子)+位移量 • 对于实模式(16位寻址): • 基址寄存器:BX,BP • 变址寄存器:SI,DI • 比例因子: 0,1 • 位移量: 0,8,16位 • 对于保护模式(32位寻址): • 基址寄存器:任何32位通用寄存器 • 变址寄存器:除ESP外的任何32位通用寄存器 • 比例因子: 1,2,4,8 • 位移量: 0,8,32位
由四元素可组合出9种存储器寻址方式。 Pentium微处理器共有11种寻址方式: • 1. 立即数寻址 • 操作数作为立即数直接存在指令中,可为字节、字、双字 • MOV ECX, 12345678H 低地址 操作码 78H 12H 34H 56H 78H ECX CS段 56H 34H 12H 高地址
2. 寄存器寻址 • 操作数包含在指令规定的8位、16位、32位寄存器中 • MOV ECX, EDX ECX EDX 12H 34H 56H 78H 12H 34H 56H 78H 寄存器寻址由于无需从存储器中取操作数,故执行速度快
3. 直接寻址 • 指令中的操作数部分直接给出操作数的有效地址EA,操作数可以是16位或32位整数,操作数默认在DS段中 • MOV AX, [3000H] 低地址 操作码 00H CS段 30H DS 0 5000 + 3000 50000 53000 DS段 53000 34H 12H 34H AX 12H 高地址
如果操作数在DS以外的其他段(CS,SS,ES,FS,GS)中,指令中必须指明段寄存器如果操作数在DS以外的其他段(CS,SS,ES,FS,GS)中,指令中必须指明段寄存器 • MOV AX, FS:[3000H] 低地址 操作码 00H CS段 30H FS 0 2000 + 3000 20000 23000 FS段 23000 34H 12H 34H AX 12H 高地址
4. 寄存器间接寻址 • 操作数地址的偏移量(有效地址EA)存放在寄存器中 • 16位寻址:偏移地址放在SI,DI,BP,BX中 • 以SI,DI, BX间接寻址,默认操作数在DS段中 • MOV AX, [SI] • 以BP间接寻址,默认操作数在SS段中 • MOV AX, [BP] • 32位寻址:偏移地址放在8个32位通用寄存器中 • 除ESP,EBP默认段寄存器为SS外,其余均默认段寄存器为DS • MOV EAX, [ESP]
低地址 MOV AX, [BP] 操作码 CS段 SS 0 7000 BP + 3000 70000 73000 SS段 73000 34H 12H 34H AX 12H 高地址
5. 基址寻址 • EA=[基址寄存器]+位移量 • 16位寻址:BP,BX为基址寄存器 • BX, DS为默认段寄存器 • BP, SS为默认段寄存器 • 32位寻址:8个32位通用寄存器均可作为基址寄存器,除ESP,EBP默认段寄存器为SS外,其余均默认段寄存器为DS MOV EAX, [BX+24] MOV DX, [EAX+1500]
MOV DX, [BX+1500] 低地址 操作码 00H CS段 DS 0 7000 15H BX 2000 + 1500 70000 73500 FS段 73500 34H 12H 34H AX 12H 高地址
6. 变址寻址 • EA=[变址寄存器]+位移量 • 16位寻址:SI,DI为基址寄存器, DS为默认段寄存器 • 32位寻址:除ESP外其余7个32位通用寄存器均可作为变址寄存器,EBP默认SS为段寄存器,其余均默认段寄存器为DS MOV AH, [SI+5] 变址寻址适用于对一维数组的元素进行操作。
7. 比例变址寻址 • EA=[变址寄存器]比例因子+位移量 • 只适用于32位寻址 • MOV EAX, [ESI*4+50] 比例变址寻址适用于一维数组操作,当数组元素大小为2/4/8字节时,它更方便、有效
8. 基址加变址寻址 • EA=[基址寄存器]+[变址寄存器] • 适用于16位和32位寻址 • MOV AX, [BX+SI] • MOV EAX, [EDX+EBP] 基址加变址寻址主要用于二维数组操作和二重循环
9. 基址加比例变址寻址 • EA=[变址寄存器] 比例因子+[基址寄存器] • 只适用于32位寻址 • MOV EAX, [EDX*8+EAX] 适用于数组元素大小为2/4/8字节时二维数组操作
10. 带位移的基址加变址寻址 • EA=[基址寄存器]+[变址寄存器]+位移量 • 适用于16位和32位寻址 • MOV AX, [BX+SI+50] • MOV EAX, [EDX+EBP+0FFFF000H] 主要用于二维数组操作,位移量为数组起始地址
11. 带位移的基址加比例变址寻址 • EA=[变址寄存器] 比例因子+[基址寄存器]+位移量 • 只适用于32位寻址 • MOV AX, [BX+SI+50] • MOV EAX, [EDX+EBP+0FFFF000H] 适用于数组元素大小为2/4/8字节时二维数组操作,位移量为数组起始地址
3.3 数据传送指令 • 执行后不影响标志位,源操作数不变 • 1. 通用数据传送指令 • MOV 目标操作数, 源操作数 • 1)源操作数可以是8/16/32位的立即数、寄存器操作数、内存操作数。目标操作数不允许为立即数,其余同源操作数。源、目不能同时为内存操作数。 • 2)源、目操作数类型必须匹配 • MOV BYTE PTR [BX], 12H • 3) 不能向段寄存器写立即数 • MOV AX, 2000 • MOV DX, AX • 4) 以CS为目标的一切传送指令都是非法的
MOVSX 目标寄存器, 源操作数 • 符号扩展传送指令 • MOV DL, -16 • MOVSX BX, DL • MOVZX 目标寄存器, 源操作数 • 零扩展传送指令 • MOV DL, -16 • MOVZX BX, DL • XCHG 目标操作数, 源操作数 • 交换指令,源、目不能同为内存操作数 • XCHG AX, [SI+0400H] • BSWAP 32位寄存器 • 字节交换指令, • MOV EAX, 12345678H • BSWAP EAX
XLAT 表头变量名 • 查表指令,用来取表中某指定数的值 • TABLE DB 48, 49, 50, 51, 52, 53, 54, 55, 56, 57 • MOV BX, OFFSET TABLE • MOV AL, 5 • XLAT TABLE 执行后AL=53 • LAHF • SAHF • 标志寄存器传送指令
2. 堆栈操作指令 • PUSH 源操作数 • 进栈指令,先调整堆栈指针,再把源操作数压栈 • PUSH AX • PUSH DWORD PTR [SI+5] • POP 目标操作数 • 出栈指令,先将栈顶2/4字节送目标操作数,再调整堆栈指针 • POP AX • POP DWORD PTR [SI+5]
PUSHF • POPF • 16位标志寄存器进栈/出栈指令 • PUSHFD • POPFD • 32位标志寄存器进栈/出栈指令 • PUSHA • POPA • 16位通用寄存器进栈/出栈指令 • PUSHAD • POPAD • 32位通用寄存器进栈/出栈指令
3. 目标地址传送指令 • LEA 目标寄存器, 源操作数 • 有效地址传送指令,源操作数为内存操作数,将内存单元的有效地址(而不是内容)传送到目标寄存器 • LEA EAX, [SI+5] • LDS/LES/LFS/LGS/LSS 目标寄存器, 源操作数 • 指针传送指令 • ADDR DD 1A2B3C4DH • LDS SI, ADDR
4. I/O数据传送指令 • 完成累加器和I/O端口之间的数据传送 • IN 累加器,端口号 • 端口号为8位时,直接寻址,最多可访问256个端口 • IN AX, PORT • 端口地址为16位时,间接寻址,端口地址必须放在DX寄存器中,最多可访问65536个端口 • IN AL, DX • OUT 端口号,累加器
3.4 算术运算指令 • 加、减、乘、除,运算对象8/16/32位有符号/无符号整数,以及BCD码 • 影响标志位 • 1. 加法指令 • ADD 目标操作数, 源操作数 • 源操作数+目标操作数——>目标操作数 • ADC 目标操作数, 源操作数 • 源操作数+目标操作数+CF——>目标操作数 • 影响A,C,O,P,S,Z6个标志位 • INC 目标操作数 • 目标操作数+1——>目标操作数 • 影响A,O,P,S,Z5个标志位
2. 减法指令 • SUB 目标操作数, 源操作数 • 目标操作数-源操作数——>目标操作数 • SBB 目标操作数, 源操作数 • 目标操作数-源操作数-CF——>目标操作数 • DEC 目标操作数 • 目标操作数-1——>目标操作数 • NEG 目标操作数 • 0-目标操作数——>目标操作数 • 影响A,C,O,P,S,Z6个标志位
CMP 目标操作数, 源操作数 • 比较指令
3. 乘法指令 • MUL 乘数 • 无符号乘法 • IMUL 乘数 • 有符号乘法 4. 除法指令 • DIV 除数 • 无符号除法 • IDIV 除数 • 有符号除法
5. 十进制调整指令 • DAA • 加法的压缩BDC码调整指令 • AAA • 加法的非压缩BDC码调整指令 • DAS • 减法的压缩BDC码调整指令 • AAS • 减法的非压缩BDC码调整指令
AAM • 乘法的非压缩BDC码调整指令 • AAD • 除法的非压缩BDC码调整指令