180 likes | 320 Views
3.1.2 与转移地址有关的寻址方式. CALL 、 LOOP 、 JMP 和条件转移指令是控制程序流程的指令,即与转移地址有关。 1. 如果控制指令与目标地址在同一代码段,这种转移叫段内转移,采用段内寻址方式,又分段内直接寻址方式和段内间接寻址方式。 例如: JMP NEAR PTR NEXT0 ;直接近转移 JMP SHORT NEXT1 ;直接短转移 JMP BX ;段内间接转移 目标地址的有效地址在 BX 中, JMP WORD PTR[BP+TABLE] ;段内间接转移
E N D
3.1.2与转移地址有关的寻址方式 • CALL 、LOOP、 JMP和条件转移指令是控制程序流程的指令,即与转移地址有关。 • 1.如果控制指令与目标地址在同一代码段,这种转移叫段内转移,采用段内寻址方式,又分段内直接寻址方式和段内间接寻址方式。 • 例如:JMP NEAR PTR NEXT0;直接近转移 • JMP SHORT NEXT1 ;直接短转移 • JMP BX ;段内间接转移 • 目标地址的有效地址在BX中, • JMP WORD PTR[BP+TABLE] ;段内间接转移 • 目标地址的有效地址在(基址指针)寄存器相对寻址的存储单元中, • SHORT、NEAR PTR是地址操作符,WORD PTR是数据类型操作符。
2.如果控制指令与目标地址分处在不同的两个代码段,这种转移叫段间转移,采用段间直接寻址方式或段间间接寻址方式。2.如果控制指令与目标地址分处在不同的两个代码段,这种转移叫段间转移,采用段间直接寻址方式或段间间接寻址方式。 • 例如: • JMP FAR PTR NEXTROUTINT;段间直接寻址 • FAR PTR是地址操作符,执行时符号地址NEXTROUTINT的段地址送给CS,有效地址送给IP,从而实现段间的直接转移。 • JMP DWORD PTR [INTERS+BX];段间间接寻址 • DWORD PTR是存储类型操作符,取双字的意思。 • 访问存储单元顺序取出两个字,分别送给IP和CS。
3.3 80X86的指令系统 • 80X86的指令系统分为6组: • 数据传送指令 串处理指令 • 算术指令 控制转移指令 • 逻辑指令 处理机控制指令
3.3.1 数据传送指令 • 分为五类: • 1.通用数据传送指令 8条 • MOV 传送 • MOVSX 带符号扩展传送 • MOVZX 带零扩展传送 • PUSH 进栈 • POP 出栈 • PUSHA/PUSHAD 所有寄存器进栈 • POPA/POAD 所有寄存器出栈 • XCHG 交换
(1)MOV 传送指令 • 格式:MOV DST,SRC • 执行操作(DST) (SRC) • DST表示目的操作数,SRC表示源操作数 • 举例: • 把一个常量(数据、地址)送入寄存器 reg data • MOV AL,5 • MOV AX,PI ;符号常数 • MOV AX,DATA__SEG ;段名,段地址 • MOV BX,NEXT0 ;标号,地址
把常数送到存储器单元,存储器单元的寻址可以有8种选择。把常数送到存储器单元,存储器单元的寻址可以有8种选择。 • MOV BYTE PTR [2000H],5 • MOV WORD PTR [BX],5 • MOV DWORD PTR[BX][SI],12345678H • 把一个寄存器的内容传送到另一个寄存器中 • MOV AX,BX • 把一个寄存器数传送到存储器单元中 • MOV ARRAY[BX],CX • 把一个存储器操作数传送到寄存器中 • MOV AL,X ;X是定义的符号地址(变量)
(2)MOVSX带符号扩展传送指令(386以上) • 格式:MOVSX DST,SRC • 操作(DST) 符号扩展的(SRC) • 有两种使用形式: • 寄存器到寄存器reg1,reg2 • MOVSX EAX,CL • 如(CL)=65H,则(EAX)=00000065H,0扩展24位 • 如(CL)=A5H,则(EAX)=FFFFFFA5H,1扩展24位 • (3)MOVZX带零扩展传送指令(386以上) • 格式和操作类似上条指令 • MOVZX EAX,CL
MOVZX EAX,CL • (CL)=65H,则(EAX)=00000065H,0扩展24位 • (CL)=A5H,则(EAX)=000000A5H,0扩展24位 • MOVSX和MOVZX指令的源操作数的长度一定要小于目的操作数,
(4)PUSH进栈指令 • 格式:PUSH SRC • 操作: • 16位操作:在当前栈顶进栈一个字的数据。先修改栈顶指针SP减2,然后将数据存入(SP)+1和(SP)指向的字单元中, • 32位操作:先修改栈顶指针(ESP) (ESP)– 4, • 然后将源操作数存入(ESP)+3、(ESP)+2、(ESP) • +1、(ESP)指向的双字单元 • 见图3.10 PUSH AX 指令的执行情况
(5)POP出栈指令 • 格式:POP DST • 操作:先弹出,后修改栈顶指针 • 16位指令:先(DST) ((SP)+1,(SP)) • 后 (SP) (SP)+2 • 32位指令:先(DST) ((ESP)+3,(ESP)+2,(ESP)+1,(ESP)) • 后(ESP) (ESP)+4
(6)PUSHA/PUSHAD • 格式:PUSHA • PUSHAD • 操作: • PUSHA是16位通用寄存器AX、CX、DX、BX依次进栈 • 接着进栈的是该指令执行前的SP、BP、SI、DI。 • 进栈后,(SP) (SP)—16 • PUSHAD是32位通用寄存器EAX、ECX、EDX、EBX依次进栈,接着是指令执行前的ESP、EBP、ESI、EDI依次进栈。 • 之后,(ESP) (ESP)—32
(7)POPA/POPAD • 格式:POPA • POPAD • 操作:寄存器出栈,出栈的顺序与进栈顺序现反,之后修改堆栈指针。 • (8)XCHG交换指令 • 格式:XCHG OPR1,OPR2 • 操作(OPR1)(OPR2) • 能完成寄存器与寄存器之间、寄存器与存储器之间的交换,除此,常数不能参加交换。 • XCHG AX,BX • XCHG AX,[BX][SI]
2.累加器专用传送指令 • IN输入 • OUT输出 • XLAT换码
(1)IN输入指令 • 长格式:IN AL,PORT(字节) • IN AX,PORT(字) • IN EAX,PORT(双字) • 执行的操作(AL) (PORT)(字节) • (AX) (PORT+1,PORT)(字) • (EAX) (PORT+3,PORT+2,PORT+1,PORT)(双字) • 短格式:IN AL,DX(字节) • IN AX,DX(字) • IN EAX,DX(双字) • 执行的操作(AL) ((DX))(字节) • (AX) ((DX)+1,(DX))(字) • (EAX) ((DX)+3,(DX)+2,(DX)+1,(DX))(双字) •
(2)OUT输出指令 • 长格式:OUT PORT,AL(字节) • OUT PORT,AX(字) • OUT PORT,EAX(双字) • 执行的操作(PORT) (AL)(字节) • ( PORT+1,PORT) ) (AX) (字) • (PORT+3,PORT+2,PORT+1,PORT) (EAX)(双字) • 短格式:OUT DX,AL(字节) • OUT DX,AX(字) • OUT DX,EAX(双字) • 执行的操作:((DX))(AL)(字节) • ((DX)+1,(DX))(AX)(字) • ((DX)+3,(DX)+2,(DX)+1,(DX))(EAX)(双字) •
(3). XLAT(Translate):换码 语法格式: XLAT ; AL = DS:[ BX +AL ] 功能描述:将DS:BX所指内存区中、由AL指定位移处的一个字节赋给AL。 对标志位的影响:无。
3. LEA (Load Effective Address ) :装入有效地址 语法格式: LEA reg16, mem ; reg16 = mem的有效地址 对标志位的影响:无。 【例】设BX = 5678H,EAX = 1,EDX = 2。 lea si, 2[bx] ; 执行后,SI = 567AH lea si, 2[eax][edx] ; 执行后,SI = 5 4. LDS、LES 语法格式: LDS reg16, mem32 ; reg16 = mem32的低字,DS = mem32的高字 LES reg16, mem32 ; reg16 = mem32的低字,ES = mem32的高字 对标志位的影响:无。
4.标志寄存器传送指令 • LAHF • SAHF • PUSHF/PUSHFD • POPF/POPFD • 5.类型转换指令 • CBW • CWD • CDQ