2.56k likes | 2.79k Views
第 3 章. 80 86 的 寻址方式 和 指令系统. 中国科学技术大学 何克东. 本章要点. 寻址方式 常用指令的功能、格式、操作、对标志的影响 计算机是如何实现转移、调用、中断的. 3.1 8086 寻址方式. 寻址 (addressing) : 把物理地址分配给程序的各条指令的过程。 寻址方式 (addressing mode) :根据指令的地址码生成操作数的物理地址的方法。. 指令. 指令地址 : 指令通常存放在内存中. 地址. 操作数地址: 操作数可以存放在多个地方. : MOV BX, 123
E N D
第 3 章 8086 的寻址方式和 指令系统 中国科学技术大学 何克东
本章要点 • 寻址方式 • 常用指令的功能、格式、操作、对标志的影响 • 计算机是如何实现转移、调用、中断的
3.1 8086寻址方式 • 寻址(addressing) :把物理地址分配给程序的各条指令的过程。 • 寻址方式(addressing mode) :根据指令的地址码生成操作数的物理地址的方法。 指令
指令地址:指令通常存放在内存中 地址 操作数地址:操作数可以存放在多个地方 : MOV BX, 123 ADD AX, BX MOV AX, [2000H] IN AX, 12H : JMP L1 : CALL SUB1 : INT 21H CS IP
寻址方式 1、 立即寻址 2、 寄存器寻址 3、 直接寻址 4、 寄存器间接寻址 5、 基址加变址寻址 6、 寄存器相对寻址 7、 相对基址加变址寻址
操作数在何处? • 直接包含在指令中 立即数 MOV AX,0 立即数寻址 • 包含在某个寄存器中 寄存器操作数 MOV AX,BX 寄存器寻址 • 在内存中 存储器操作数(内存操作数)MOV AX,[1000H] 存储器寻址 • 在外设中 I/O操作数 IN AL,12H I/O寻址
一、 立即寻址方式 • 操作数直接存放指令中,紧跟在操作码之后。 • 这种操作数被称为立即数 imm • 它可以是8位数值i8(00H~FFH) • 也可以是16位数值i16(0000H~FFFFH) • 立即数寻址方式常用来给寄存器、存储器赋值 指令 操作数
立即数寻址指令 MOV AL,05H ;AL←05H MOV AX,0102H ;AX←0102H
错误: MOV AL, 256 MOV 12, AL
二、寄存器寻址方式 • 操作数存放在CPU的内部寄存器reg中,可以是: • 8位寄存器r8: AH、AL、BH、BL、CH、CL、DH、DL • 16位寄存器r16: AX、BX、CX、DX、SI、DI、BP、SP • 4个段寄存器seg: CS、DS、SS、ES 指令 寄存器 寄存器号 操作数
寄存器寻址指令 MOV AX,1234H ;AX←1234H MOV BX,AX ;BX←(AX)
错误用法 MOV AL , BX MOV AX , BL
存储器寻址方式 • 操作数在存储器中。指令中给出操作数在主存中的地址信息(偏移地址,称之为有效地址EA),而段地址在默认的或用段超越前缀指定的段寄存器中 • 物理地址=段地址+EA(有效地址) 段地址=(段寄存器)×16 EA=偏移地址 / [基址]+[变址]+[位移量]
8086设计了多种存储器寻址方式 1、直接寻址方式 2、寄存器间接寻址方式 3、寄存器相对寻址方式 4、基址变址寻址方式 5、相对基址变址寻址方式
三、直接寻址方式 • 有效地址在指令中直接给出 • 默认的段地址在DS段寄存器,可使用段超越前缀改变 段寄存器 段基址 存储器 指令 ⊕ 操作数 EA
直接寻址指令 MOV AX,[2000H] ; AX←(DS:[2000H]) ;指令代码:A10020 MOV AX,ES:[2000H]; AX←(ES:[2000H]) 段超越前缀 ;指令代码:26A10020
错误用法 DATA1 DB 1,2 DATA2 DW 1,2 : MOV AL,DATA2 MOV AX,DATA1
四、寄存器间接寻址方式 • 有效地址存放在基址寄存器BX、BP或变址寄存器SI、DI中。 • 默认的段地址在DS段寄存器,可使用段超越前缀改变(如果使用BP,则默认的段地址在SS段寄存器)。
寄存器间接寻址指令 MOV AX,[SI] ; AX←(DS:[SI]) MOV AX,[BX] ;AX←(DS:[BX]) MOV AX,[BP] ;AX←(SS:[SP])
错误用法: MOV AX,[CX] MOV BX, [AX] MOV AX, [BL] MOV [BX],1
五、寄存器相对寻址方式 • 有效地址是寄存器内容与有符号8位或16位位移量之和,寄存器可以是BX、BP或SI、DI 有效地址=BX/BP/SI/DI+8/16位位移量 • 段地址对应BX/SI/DI寄存器默认是DS,对应BP寄存器默认是SS;可用段超越前缀改变
寄存器相对寻址指令 MOV AX,8[SI] ; AX←(DS:[SI]+8 ) MOV AX,[SI+8] MOV AX,-8[BX] ;AX←(DS:[BX]-8 ) MOV AX,2[BP] ;AX←(SS:[BP]+2)
六、基址变址寻址方式 • 有效地址由基址寄存器(BX或BP)的内容加上变址寄存器(SI或DI)的内容构成: 有效地址=BX/BP+SI/DI • 段地址对应BX基址寄存器默认是DS,对应BP基址寄存器默认是SS;可用段超越前缀改变
基址变址寻址指令 MOV AX,[BX+SI]; AX←(DS:[BX+SI]) MOV AX,[BP+DI]; AX←(SS:[BP+DI]) MOV AX,DS:[BP+DI];AX←(DS:[BP+DI])
七、相对基址变址寻址方式 • 有效地址是基址寄存器(BX/BP)、变址寄存器(SI/DI)与一个8位或16位位移量之和: 有效地址=BX/BP+SI/DI+8/16位位移量 • 段地址对应BX基址寄存器默认是DS,对应BP基址寄存器默认是SS;可用段超越前缀改变
相对基址变址寻址指令 MOV AX,[BX+SI+06H] ;AX←(DS:[BX+SI+06H]) MOV AX,06H[BX][SI];
3.2 指令的机器码表示方法 • 高级语言:a= 0F03AH • 汇编语言:MOV DI, 0F03AH • 助记符 目 源 • 机器语言:计算机唯一能识别的语言 10111111 00111010 11110000
P67 MOV SP,BX
3.3 8086指令系统 一、 数据传送指令 二、算术运算指令 三、逻辑运算和移位指令 四、字符串指令 五、程序控制指令 六、 处理器控制指令
一、数据传送指令 • 数据传送是计算机中最基本、最重要的一种操作 • 传送指令也是最常使用的一类指令 • 传送指令把数据从一个位置传送到另一个位置 • 除标志寄存器传送指令外,均不影响标志位
立即数 通用寄存器 AX BX CX DX BP SP SI DI 存 储 器 段寄存器 CS DS ES SS 1 、 通用数据传送指令 (1)MOV传送指令 指令格式: MOV 目标,源 指令功能:目标 (源)
寻址类型 指令 源 地址生成 目标 寄存器BX 寄存器AX 寄存器寻址 MOV AX,BX 立即寻址 MOV CH,3AH 数据3AH 寄存器CH DS×10H+DISP 10000H+1234H 存储器地址11234H 直接寻址 MOV [1234H],CL 寄存器CL DS×10H+BX 10000H+0300H 存储器地址10300H 寄存器CL 寄存器间接寻址 MOV [BX],CL 注意:BX=0300H,SI=0200H,ARRAY=1000H,DS=1000H
寻址类型 指令 源 地址生成 目标 存储器地址10500H DS×10H+BX+SI 10000H+0300H+0200H 寄存器BP 基址加变址寻址 MOV [BX+SI],BP DS×10H+BX+4 10000H+0300H+4 存储器地址10304H 寄存器相对寻址 MOV CL,[BX+4] 寄存器CL DS×10H+ARRAY+BX+SI 10000H+1000H+0300H+0200H 相对基址加变址寻址 MOV ARRAY[BX+SI],DX 存储器地址11500H 寄存器DX 注意:BX= 0300H,SI= 0200H,ARRAY=1000H,DS=1000H
立即数传送 mov al,4 ;al←4,字节传送 mov cx,0ffh ;cx←00ffh,字传送 mov si,200h ;si←0200h,字传送 mov byte ptr [si],0ah ;byte ptr 说明是字节操作 mov word ptr [si+2],0bh ;word ptr 说明是字操作
寄存器传送 mov ax,bx ;ax←bx,字传送 mov ah,al ;ah←al,字节传送 mov ds,ax ;ds←ax,字传送 mov [si],al ;[si]←al,字节传送
存储器传送 mov al,[bx] mov dx,[bp] ;dx←ss:[bp] mov es,[si] ;es←ds:[si]
段寄存器传送 mov [si],ds mov ax,es ;ax←es mov ds,ax ;ds←ax←es
注 意 • 源操作数可以是8/16位的立即数、寄存器操作数、内存操作数。目标操作数不允许为立即数,其余同源操作数。源、目不能同时为内存操作数。 • 以CS、IP为目标的一切指令都是非法的
两个操作数的类型要一致 • 绝大多数双操作数指令,除非特别说明,目的操作数与源操作数必须类型一致,否则为非法指令 MOV AL,050AH MOV AL,BX • 寄存器有明确的字节或字类型,有寄存器参与的指令其操作数类型就是寄存器的类型 • 对于存储器单元与立即数同时作为操作数的情况,必须显式指明;byte ptr指示字节类型,word ptr指示字类型 mov byte ptr [si],0ah
两个操作数不能都是存储器 8086指令系统不允许两个操作数都是存储单元(除串操作指令),要实现这种传送,可通过寄存器间接实现 Mov buffer1,buffer2 mov ax,buffer1 ;ax←buffer1(将buffer1内容送ax) mov buffer2,ax ;buffer2←ax ;这里buffer1和buffer2是两个字变量 ;实际表示直接寻址方式
要小心段寄存器的操作 • 不允许立即数传送给段寄存器 MOV DS,100H MOV AX, 100H MOV DS,AX ;非法指令:立即数不能传送段寄存器 • 不允许直接改变CS值 MOV CS,AX;不允许使用的指令 • 不允许段寄存器之间的直接数据传送 MOV DS,ES MOV AX,ES MOV DS,AX ;非法指令:不允许段寄存器间传送
(2) PUSH 进栈操作指令 指令格式: PUSH 源操作数 指令功能 :SP(SP)-2 (SP)+1,(SP) (源操作数)
SS 栈顶 MOV AX,1234H MOV BX, 5678H PUSH AX PUSH BX 12 34 56 78 78H 56H 34H 12H SP 栈底 堆栈(Stack)
汇编语句 例子 说明 PUSH reg16PUSH BX16位寄存器 PUSH mem16PUSH WORD PTR[BX] 16位寻址方式 PUSH segPUSH DS 任何段寄存器
例:现场保护恢复 push ax ;进入子程序后 push bx push ds ... pop ds ;返回主程序前 pop bx pop ax
(3) POP 出栈操作指令 指令格式:POP 目标 指令功能:目标 ((SP)+1,SP)) SP (SP)+2
SS 栈顶 POP BX POP AX 78H 56H 12H 34H 78H 56H 34H 12H SP 栈底 堆栈(Stack)
POP指令 汇编语句 例子 说明 POP reg16POP CX 16位寄存器 POP mem16POP WORD PTR[BX+1] 16位存储器地址 POP segPOP DS 任何段寄存器
(4) XCHG 交换指令 • 指令格式:XCHG 目标, 源 指令功能:(目标)↔(源) • 将寄存器的内容与任何其他寄存器或存储单元的内容交换。