《Win32汇编语言寻址方式.ppt》由会员分享,可在线阅读,更多相关《Win32汇编语言寻址方式.ppt(59页珍藏版)》请在三一办公上搜索。
1、2023/5/30,1,宋军计算机学院信息安全系,寻址方式,2,2023/5/30,寻址方式,操作数的寻址方式 立即数寻址寄存器寻址存储器寻址直接寻址间接寻址相对寻址,3,2023/5/30,立即数寻址,操作数在指令中给出 指令格式:MOV AL,5 MOV AX,3064H MOV AL,A只能用于 SRC 字段 MOV 40H,AL SRC 和 DST 的字长一致 MOV AH,3064H,4,2023/5/30,寄存器寻址,操作数存放在CPU的内部寄存器reg中:8位寄存器r8:AH/AL/BH/BL/CH/CL/DH/DL16位寄存器r16:AX/BX/CX/DX/SI/DI/BP/S
2、P32位寄存器r32:EAX/EBX/ECX/EDX/ESI/EDI/ESP/EBP4个段寄存器seg中:CS/DS/SS/ES 指令格式:MOV AX,BX MOV AL,BH MOV AX,3064H SRC 和 DST 的字长一致 MOV AH,BX,5,2023/5/30,存储器寻址(直接寻址),寻址主存中存储的操作数就称为存储器寻址方式(也称为内存寻址方式)指令中给出的是有关操作数的主存地址信息指令中主存操作数给出的地址只是偏移地址(称有效地址EA)实模式下,段基地址在默认的段寄存器中或用段超越前缀指定的段寄存器中,6,2023/5/30,有效地址的组成,位移量:存放在指令中的8位、
3、16位或32位的数值或常量基址:存放在基址寄存器中的内容。它是有效地址中的基址部分;变址:是存放在变址寄存器中的内容比例因子:可以是1248比例因子只适用于保护模式。,7,2023/5/30,16位存储器寻址有效地址,16位有效地址基址寄存器变址寄存器816位位移量,其中:基址寄存器只能是BX或BP 变址寄存器只能是SI或DI 位移量可以是8/16位数 当基址寄存器为BP的时候,默认的堆栈段寄存器SS;其他情况下,默认数据段寄存器DS。,8,2023/5/30,32位存储器寻址有效地址,其中:位移量是8/16/32数值或者常量任何32位通用寄存器都可以作为基址寄存器(默认ESP/EBP使用SS
4、;其他默认使用DS)任何除ESP之外的32位通用寄存器都可以作为变址寄存器,32位有效地址基址寄存器变址寄存器8/16/32位位移量,9,2023/5/30,直接寻址方式,例:MOV AX,2000H EA=2000H,假设(DS)=3000H,那么PA=32000H,隐含的段为数据段 DS,10,2023/5/30,直接寻址方式,可使用段跨越前缀 MOV AX,ES:2000H操作数地址可由变量(符号地址)表示,但要注意 VALUE DB 10 变量的属性 MOV AH,VALUE;等价于 MOV AH,VALUE 可用符号地址代替数值地址 MOV AX,VALUE MOV AX,WORD
5、PTR VALUE 操作数尺寸要一致,11,2023/5/30,间接寻址/间接操作数,操作数的有效地址存放在寄存器中方括号括起来的寄存器,如BX,SS:EBX保护模式:32位通用寄存器实地址:16位,SI,DI,BX,BP寄存器里存放着数据的偏移地址用作间接操作数的寄存器使用时应先初始化,.data var1 BYTE 10h,20h,30h.code MOV esi,offset var1 MOV al,esi;如在附加段中,MOV al,ES:esi,12,2023/5/30,尺寸问题,PTR:与间接操作数的联合使用PTR操作符指明操作数的大小,.data var1 BYTE 10h,20
6、h,30h.code MOV esi,offset var1 INC esi;,operand must have size,.data var1 BYTE 10h,20h,30h.code MOV esi,offset var1 INC BYTE PTR esi,13,2023/5/30,数组求和,.386.model flat,stdcall.dataW1 WORD 1234h,5678h,4321h,8765h.codemov esi,offset W1mov ax,esi;1234hadd esi,2 add ax,esi;1234h+5678hadd esi,2 add ax,esi
7、;1234h+5678h+4321hadd esi,2 add ax,esi;1234h+5678h+4321h+8765h,14,2023/5/30,例:寄存器间接寻址方式,.386.model flat,stdcall.data d_var dword 12345678h.codestart:mov esi,offset d_var mov eax,esi mov eax,esi mov eax,offset c_var mov eax,cs:eax ret;返回操作系统 c_var dword 87654321h end start;汇编结束,15,2023/5/30,例:运行结果(1)
8、,16,2023/5/30,例:运行结果(2),17,2023/5/30,寄存器相对寻址方式,采用寄存器间接寻址的操作数的有效地址是寄存器内容与有符号8位,16位或32位位移量之和操作数的有效地址的计算公式是:位移量可以是正数,也可以是负数,有效地址寄存器+8/16/32位位移量,18,2023/5/30,例:寄存器相对寻址方式,.386.model flat,stdcall.data array byte 1,2,3,4,5,6,7 array_end equ$-1.code start:mov esi,offset array mov al,esi mov al,esi+4 mov esi
9、,array_end mov al,esi-4 ret;返回操作系统 end start;汇编结束,19,2023/5/30,19,2023/5/30,例:mov esi,offset array,直接寻址,array的地址,20,2023/5/30,20,2023/5/30,例:mov al,esi,寄存器间接寻址,esi=00404000,地址00404000的内容,21,2023/5/30,21,2023/5/30,例:mov al,esi+4,寄存器相对寻址esi+4=00404004,esi=00404000,00404004=05h,22,2023/5/30,22,2023/5/3
10、0,例:mov esi,array_end,直接寻址,array_end equ$-1;$=00404007;array_end=00404007-1=00404006,23,2023/5/30,23,2023/5/30,例:mov al,esi-4,寄存器相对寻址esi-4=00404002,00404002=03h,esi=00404006,24,2023/5/30,基址变址寻址方式,基址变址寻址方式的操作数的有效地址是基址寄存器的内容加上变址寄存器内容构成操作数的有效地址的计算公式是:,有效地址基址寄存器+变址寄存器,25,2023/5/30,例:基址变址寻址方式,.386.model
11、flat,stdcall.data array1 byte 1,2,3,4,5,6,7 array2 byte 8,9,10,11,12,13,14 array_end equ$-1.codestart:mov ebx,offset array1 mov esi,1 mov al,ebx+esi;也可以写成 mov al,ebxesi mov ebx,offset array2 mov al,ebx+esi ret;返回操作系统end start;汇编结束,26,2023/5/30,26,2023/5/30,例:mov ebx,offset array1,直接寻址,array1的地址,27,2
12、023/5/30,27,2023/5/30,例:mov esi,1,28,2023/5/30,28,2023/5/30,例:mov al,ebx+esi,基址变址寻址esi+ebx=00404001,00404001=02h,29,2023/5/30,29,2023/5/30,例:mov ebx,offset array2,直接寻址,array2的地址,30,2023/5/30,30,2023/5/30,例:mov al,ebx+esi,基址变址寻址esi+ebx=00404008,00404008=09h,31,2023/5/30,相对基址变址寻址方式,相对基址变址寻址方式的操作数有效地址是
13、基址寄存器的内容加上变址寄存器内容再加上一个8位,16位或32位的位移量构成操作数的有效地址的计算公式是:,有效地址基址寄存器+变址寄存器+8/16/32位位移量,32,2023/5/30,例:相对基址变址寻址,.386.model flat,stdcall.data array byte 1,2,3,4,5,6,7 byte 8,9,10,11,12,13,14 byte 15,16,17,18,19,20,21 numcols equ 7 n equ 2.codestart:mov ebx,numcols mov esi,1 mov al,arrayebxesi ret;返回操作系统end
14、 start;汇编结束,33,2023/5/30,例:mov ebx,numcols,34,2023/5/30,例:mov al,arrayebxesi,基址变址寻址00404000+7+1=00404008,00404008=09h,array的地址,35,2023/5/30,比例因子寻址方式,仅用于32位应用程序操作数的有效地址是由变址寄存器的内容乘以比例因子再加上位移量和基址寄存器的内容构成计算公式为:比例因子寻址方式中可以没有基址寄存器和位移量,比例数只能是1,2,4,8这四种取值之一,有效地址=基址寄存器+(变址寄存器)比例因子+位移量,36,2023/5/30,例:比例因子寻址方式
15、,.386.model flat,stdcall.data array word 1,2,3,4,5,6,7 word 8,9,10,11,12,13,14 word 15,16,17,18,19,20,21 row equ 72 n equ 2.codestart:mov ebx,row mov esi,1 mov ax,arrayebxesi*2;也可以写成mov ax,array+ebx+esi*2 ret;返回操作系统end start;汇编结束,37,2023/5/30,例:mov ebx,row,38,2023/5/30,例:mov esi,1,39,2023/5/30,mov a
16、x,arrayebxesi*2,比例因子寻址00404000+14+1*2=00404010,00404010=09h,array的地址,40,2023/5/30,操作数寻址方式的组合,操作数寻址方式在指令中并不是任意组合的,是有一定规律的 大多数指令(常用的数据传送、加减运算、逻辑运算等指令)都支持如下组合:源操作数可以由立即数、寄存器或存储器寻址,目的操作数只能是寄存器或存储器寻址,两个操作数不能同时为存储器寻址方式。,指令助记符 reg,imm/reg/mem指令助记符 mem,imm/reg,41,2023/5/30,练习:,假定实模式下,(DS)=2000H,(ES)=2100H,(
17、SS)=1500H,(SI)=00A0H,(BX)=0100H,(BP)=0010H,数据段中变量名VAL的偏移地址为0050H,试指出下列源操作数字段的寻址方式是什么?其物理地址值是多少?(1)MOV AX,0ABH(2)MOV AX,BX(3)MOV AX,100H(4)MOV AX,VAL(5)MOV AX,BX(6)MOV AX,ES:BX(7)MOV AX,BP(8)MOV AX,SI(9)MOV AX,BX+10(10)MOV AX,VALBX(11)MOV AX,BXSI(12)MOV AX,VALBXSI,42,2023/5/30,转移地址寻址方式,汇编程序的执行顺序是由代码段
18、寄存器CS和指令指针EIP的内容决定的。程序转移指令通过改变EIP和CS的内容,就可以改变程序的正常执行顺序。,JMP,43,2023/5/30,JMP指令,JMP指令是无条件转移指令,其格式为:JMP指令中的操作数label是要转移到的目标地址,也称为目的地址、转移地址。,JMP label;程序转向label标号指定的地址,44,2023/5/30,转移地址寻址,直接寻址转移地址直接包含在指令的机器代码中就是直接寻址方式。间接寻址 转移地址如果存放在寄存器或主存单元中,就是间接寻址方式。,用寄存器或存储器操作数表达,用标号表达,45,2023/5/30,转移距离,段内转移指在当前代码段范围
19、内转移,因此不需要更改CS段地址,只要改变EIP偏移地址。段间转移指从当前代码段跳转到另一个代码段,此时需要更改CS段地址和EIP偏移地址。,46,2023/5/30,转移地址的寻址方式,段内直接寻址段内间接寻址段间直接寻址段间间接寻址,47,2023/5/30,段内直接寻址,指令中直接写出目标地址的标号,而在对应的机器码中,包含位移量的补码形式。位移量-紧接着JMP指令后的那条指令的偏移地址到目标指令的偏移地址的地址位移。当向地址增大方向转移时,位移量为正;向地址减小方向转移时,位移量为负。,48,2023/5/30,相对转移,段内直接寻址也叫作相对转移相对转移目的地址的计算公式为:,目的地
20、址=当前EIP+位移量(8bit/16bit/32bit),近转移:位移量为8位 段转移:位移量为32位,49,2023/5/30,例:段内直接寻址,.386.model flat,stdcall.codestart:mov eax,0jmp startquit:ret;返回操作系统end start;汇编结束,50,2023/5/30,50,2023/5/30,调试例,51,2023/5/30,51,2023/5/30,调试例,位移量F9=00401010-00401017,52,2023/5/30,52,2023/5/30,调试例,53,2023/5/30,短转移和近转移,汇编程序能够根据
21、位移量大小自动形成短转移或近转移指令。也可以用short ptr和near ptr操作符,强制产生相应的指令格式。,54,2023/5/30,54,2023/5/30,强制近转移,near ptr 强制产生近转移,位移量FFFFFFF8=00401010-0040101A,55,2023/5/30,段内间接寻址,将同一代码段内的目标地址存放在一个32位寄存器中或双字存储器单元中,用寄存器或存储器来间接寻址转移地址。,转移地址=寄存器或存储器内容,56,2023/5/30,例:段内间接寻址,.386.model flat,stdcall.dataaddress dword quit.codestart:jmp addressquit:ret;返回操作系统end start;汇编结束,57,2023/5/30,调试例,58,2023/5/30,寄存器间接寻址内存,转移地址也可以存放在寄存器中:,mov eax,offset quitjmp eax,59,2023/5/30,本章小结,操作数:直接,直接偏移,间接,变址数据传送指令MOV,MOVZX,MOVSX,XCHG算术运算指令INC,DEC,ADD,DEC,NEGMUL/IMUL,DIV/IDIV状态标志:CF,OF,ZF,SF,
链接地址:https://www.31ppt.com/p-5027285.html