汇编复习

第一章:

1、理解汇编语言与机器语言的区别与联系

(1)机器语言是一种数字语言,人难以理解
2)汇编语言采用助记符描述指令,人易理解些
3)汇编指令同机器指令有一一对应的关系

2、什么叫汇编语言?

汇编语言是所有程序语言中最古老的语言,它与计算机的机器语言最为接近,通过汇编语言可以直接访问计算机的硬件,需要深入了解计算机体系结构和操作系统的大量细节。

3、掌握进制转换、与或非运算

二进制数以2为基数,每个数位为0或1:最左边的位称为最高有效位(MSB符号位;0表示正),最右边的位称为最低有效位(LSB),有符号整数可以表示正数也可表示负数,无符号整数不能表示负数。

进制转换:

  1. 十进制转二进制方法
  2. 二进制(B)与八进制(O)、十六进制(h)间的相互转换方法
  3. 二进制加法
  4. 与或非运算

4、其他

IA-32/IA-64体系中,基本存储单位是字节(byte),每个字节含8个二进制位;字(word,2个字节);无符号字节数值范围:0~255;有符号字节数值范围:-128~127内存容量硬盘容量:1K   = 2 10;计算机采用字符集(ASCII、Unicode、GB2312)表示字符。

二进制整数:以原始形式存储在内存中的整数

ASCII数字字符串:由ASCII字符构成的字符串,例如“123”,“65”等。

每个十六进制数位可以代表四个二进制数位,两个十六进制位可以表示一个字节的数据

补码的运算:将全部数位取反加1,数位取反的方法是用15去减数位值

第二章:

1、了解微机的结构

微机的基本结构:中央处理器CPU、内存存储单元、输入/输出设备、通过三大总线连接(数据、地址、控制)

中央处理器 CPU:寄存器、高频时钟(用于CPU内部操作和其他系统部件之间的同步)、控制单元(CU)(协调执行机器指令时各个步骤的次序)、算术逻辑单元(ALU)(执行加法等算术逻辑运算)

内存存储单元:计算机程序运行时存放指令和数据的地方

总线:是一组用于在计算机各部分之间传送数据的并行线;数据总线(在CPU与外部之间传送指令和数据);控制总线(使用数字信号,同步、控制接入到总线上的所有设备的动作);

地址总线(传输指令和数据的地址)

其他----->什么叫时钟?(涉及CPU和系统总线的每个操作都由一个内部时钟同步。它以固定的频率产生脉冲)

机器指令使用的最基本的时间单位称为机器周期或时钟周期;
时钟频率是时钟周期的持续时间的倒数。用每秒振荡的次数来计算;
CPU的主频为CPU内部时钟的频率;
机器指令的执行至少需要一个时钟周期,很多指令需要多个时钟周期完成一条指令。

程序在开始执行之前必须装入内存、指令指针寄存器(IP,CPU中的一个寄存器)存有要执行的下一条指令的地址、指令队列存放着若干条要执行的指令;

由于内存与CPU速度相差巨大,目前一般是采取缓存(缓存是一块特殊内存,存取速度比普通内存快得多)的方式来提高速度,程序在第一次读取某数据时,将此数据范围内的一块内存数据读入并存放到缓存中,以后再操作此块内存时,则不进行真正的内存操作,而在缓存中进行。

2、掌握IA32处理器的基本执行环境,掌握各寄存器的作用

基本执行环境

地址空间:

  • 保护模式下,可寻址4GB的线性地址空间--32位地址线;
  • 实地址模式下,用到20根地址线,最大地址访问量是1M
  • 虚拟8086模式下,可运行多个虚拟的8086模式程序,每个程序拥有独立的1M地址空间;

8个32位的通用寄存器:EAX,EBX,ECX,EDX,ESI,EDI,EBP,ESP

通用寄存器用于算术运算和数据的传送;EAX(扩展累加寄存器)乘法和除法指令中自动使用;ECX(循环计数器)、ESI(扩展源变址寄存器)和EDI(扩展目的变址寄存器)由高速内存数据传送指令使用、ESP(扩展堆栈指针寄存器)寻址堆栈(一种系统内存结构)上的数据、EBP(基址指针寄存器)指向堆栈上的函数参数和局部变量、EBX (基址寄存器:地址索引),EDX (数据寄存器:常用于数据传递)

616位的段寄存器:

在实模式下,段寄存器用来存放段的基地址

在保护模式下,段寄存器存放段描述符的索引(段描述符选择子)

在保护模式下的应用程序编程,较少关注段寄存器,而在实模式下,则是必须关注的,         不正确的段寄存器设置,会导致内存的错误访问。

CS用于指向代码、SS用于指向堆栈、DS等其他段寄存器指向数据(全局变量)

指令指针寄存器EIP:存放下一条要执行的指令的地址,CPU会自动修改EIP

EFLAGS寄存器(标志寄存器):由控制CPU的操作或反映CPU某些运算结果的独立的         二进制位构成,C(进位标志CF)、A(辅助进位标志AC)、P(奇偶标志PF)、Z(零         标志ZF)、S(符号标志SF)、O(溢出标志OF)、DD=1,自动减)、II=0,中断屏   蔽)、TT=1,置单步执行方式)

3、理解指令的运行过程

机器指令的执行:

取指令:控制单元从指令队列中取出指令并递增指令指针(IP)

解码:控制单元对指令进行解码以确定该条指令要执行什么操作、控制单元将输入操作数传           递给算术逻辑单元,并向它发送信号指明要执行的操作

执行:算术逻辑单元执行指令,以寄存器为操作数,结果送到有名寄存器或内存,更新处理           器的状态标志

取操作数:如指令的操作数在内存中,控制单元就产生读内存操作从内存中传入到内部寄存           器中

处理器可以采用流水线技术来实现多个部件间的并行处理,以提高系统的效率。

4、掌握IA-32处理器有3种基本的操作模式,特别是保护模式与实模式(包括地址计算等)

IA-32处理器3种基本操作模式:保护模式(基本模式)、实地址模式、虚拟8086模式

保护模式:

指令级别、不同程序间内存独立、现代的windows,Linux等操作系统、从286开始引入保护模式的概念,地址线32根,可寻址4G空间,地址范围为0~0FFFFFFFFH、使用内存的方式:平坦分段模式(Windows)、多段模式

平坦分段模式:所有段都映射到计算机的32位的地址空间中,一个程序包含代码段和数据段,每个段都由一个段描述符(64位的一个值,包括段的基址,段的长度及其他属性值),多个段描述符集中存放在段描述符表。再通过一个寄存器GDTR指向这片内存的首地址。段寄存器中存放的是段描述符选择子。

平坦分段模式内存访问:

CPU通过GDTR寄存器找到段描述符表--->通过段寄存器查找到具体的段描述符判断地址是否越界---->如未越界,将指令中的地址值加上段描述符中的段基址,形成线性地址--->通过分页机制--->再去访问最终的物理内存

实地址模式:

8086的工作模式、在CPU加电时,CPU工作在实模式、无指令级别,内存不独立、DOS操作系统、20位地址线、访问1M字节内存、地址范围0~0FFFFFH

Intel采取的方案是分段的方式。要形成地址,必须包含两个东西,一个称作段址,一个称作偏移量。这两部分都是16位的。通过将段址左移四个二进制位与偏移量相加,形成20位地址

20位线性地址的计算:线性地址也称为绝对地址,是一个20位的二进制值。程序中,用两个16位整数来表示,称为段-偏移地址,表达为段址:偏移值,这个地址也称作逻辑地址,逻辑地址转换成线性地址的公式:段值* 16+ 偏移值

第三章:

理解汇编语言的基本要素,能写出完整的汇编程序

字符常量:以单引号或双引号括起来的单个字符、存储为对应字符的ASCII码

保留字:指令的助记符(mov)、伪指令、属性、运算符、预定义符号;

标识符:标识变量、常量、过程名或代码标号,大小写不敏感;

伪指令:定义变量、过程、宏、定义段

汇编指令:标号(可选)、助记符、操作数、注释(可选)

理解汇编程序转换为可执行程序的全过程

汇编,链接,运行,调试程序:

汇编器将源代码生成含机器码的文件,称作目标文件,目标文件不能执行       (MASM)--->链接器将目标文件连接生成可执行文件(LINK)--->启动执行

掌握配置VC6的方法

掌握汇编数据定义方法、符号常量的定义方法

内部数据类型:BYTE(DB)字节、SBYTE(DB)带符号字节、WORD(DW)字、SWORD带符号字;

数据定义语句:内存中给变量分配存储空间,可以指定多个初始值,表示连续占用多个空间,依次存储这些初始值

字符串:每个字符占一个字节空间,值为其ASCII码值

DUP 运算符:使用一个整数表达式作为计数器,为多个数据项分配存储空间

V1  BYTE  10  dup ( 0) 表示v1占用10个字节空间,每个字节的初值均为0

理解Intel处理器所使用的小端顺序,并能灵活运用。

小端顺序:变量的最低字节存储在最低地址单元

未初始化数据的声明:data?在生成的执行文件中,未初始化段不占用文件的存储空间

符号常量:不允许重定义,相当于C语言里用define定义的宏Name EQU expression 

$ 运算符(操作符):表示当前地址

第四章 数据传送寻址和算术运算:

掌握数据传送指令MOVXCHG的使用,了解MOVZXMOVSXLAHFSAHF的使用

MOV指令:将源操作数复制到目的操作数;两个操作数的尺寸需一致、两个操作数不能同时为内存操作数、目的操作数不能是CS,EIP,IP、立即数不能直接送给段寄存器

XCHG指令:将两个操作数的内容交换

MOVZX指令:高位补0

MOVSX指令:符号位扩展到整个高位部分

LAHF指令:将标志寄存器(EFLAGS)的低8位复制到AH寄存器(无操作数)

SAHF指令:将AH寄存器复制到标志寄存器的低8位(无操作数)

掌握加减运算INCDECADDSUBNEG指令

INC指令:加1;会影响到标志位(AF OF PF SF ZF),但不影响进位标志位(CF)

DEC指令:减1

ADD/SUB 指令:将相同尺寸的源操作数和目的操作数相加,结果存到目的操作数、指令规则与MOV指令相同、会修改CF,ZF,SF,OF,AF,PF

NEG 指令:求数的相反数,即用0去减操作数,如ADD指令一样影响标志位

掌握有符号数与无符号数溢出的判断方法

有符号数:溢出位(OF)、(OF)的设置方法:将最高位的进位与次最高位的进位相异或

无符号数:进位位(CF)

零标位(ZF):判断结果是否为0,如两数是否相等

符号位(SF):标识结果的正负

掌握OFFSETPTRTYPELENGTHOF操作符的使用,了解ALIGNSIZEOFLABEL的使用

OFFSET 操作符:返回数据标号的偏移地址,以字节为单位

PTR操作符:重载操作数声明的默认大小,类似于强制类型转换

TYPE操作符:返回按字节计算的变量的单个元素的大小

LENGTHOF操作符:返回操作数的元素个数、只返回同一行的元素个数、如果声明的数组初值跨行了,则只计算第一行的初值个数、如果初值的末尾是逗号,则会包括下一行的个数

ALIGN操作符:变量的位置按指定的大小对齐、大小可以指定为1,2,4,8,16(指定为不同的指令集时稍有些差异,如.386只支持1,2,4)、默认大小为1、如设为16,意即后边的变量的地址将是16的整数倍

SIZEOF操作符:返回操作数所占的字节数总数(LENGTHOF和TYPE返回值的乘积)

LABEL操作符:为其后定义的变量提供一个别名以及一个不同的尺寸属性、不会分配存储空间、不再需要PTR操作符

掌握寻址方式:间接寻址、变址寻址,了解变址操作数中的比例因子

间接寻址:利用寄存器内的值作为地址,访问操作数 表达的方法是将寄存器用方括号括起来、如mov ax,[si],即表示用si寄存器中的值作为地址,访问该内存单元,取出值存到ax寄存器中

间接操作数:保护模式,间接操作数可以使用任意的32位通用寄存器、实模式则只支持si,di,bx,bp四个寄存器作为间接寻址的寄存器、可以是源操作数,也可以是目的操作数、适宜用于数组的访问

变址寻址:把寄存器的值加上一个常量作为地址,访问内存操作数、

变址操作数中的比例因子:CPU支持比例因子,便于计算地址(如数组元素地址)

掌握JMP指令和LOOP指令的使用

JMP指令:无条件转移、接着从目的地址开始执行指令、目的地址一般为标号、通常在当前过程内跳转 JMP  目的地址

LOOP指令:将ecx的值减1,接着与0比较,如果不等于0,就执行目的地址开始的指令,如果等于0 ,则不跳转,接着执行紧跟在LOOP指令后的指令、通常,ecx里的值就是循环次数。但如果初值为0,因是先减1再判断是否等于0,所以,实际实际循环次数就是  1 00 00 00 00 H、实模式下,使用的是cx作为控制循环的寄存器、LOOPD也使用ecx控制循环,LOOPW使用cx控制循环、目的地址和当前地址只能相距-128~127之间、循环可以嵌套

其他

直接-偏移操作数:在变量名后加上一个偏移值

Mov al , arrayB           ; al=10h

Mov al , [arrayB + 1]   ;al=20h,不要求一定要使用[ ]

Mov al , arrayB + 1     ;与上例同价,al=20h

过程:

掌握pushpop指令,并能理解这些指令对ESP寄存器的影响,了解PUSHFD,POPFD,PUSHAD,POPAD

PUSH :压栈操作的指令,将操作数放入到堆栈中(将ESP减4将要压入的32位值拷贝到ESP指向的内存)对于32位操作数,ESP减4,存到栈中的内容为双字;对于16位操作数,ESP减2,存到栈中的内容为字。保护模式的立即数总是32位的;实模式下,如果未使用.386(或更高的)处理器伪指令,则立即数默认是16位的;

POP:出栈操作的指令,从堆栈中取出数放到指令中的操作数中(将ESP指向的内存中的内容取出来,放到操作数中将ESP加4);对于32位操作数,是先从栈中拷贝双字到操作数中,然后ESP加4;对于16位操作数,是先从栈中拷贝字到操作数中,然后ESP加2;

PUSHFD:把32位的标志寄存器压入堆栈,无操作数

POPFD:从堆栈中弹出32位值到标志寄存器中,无操作数

实模式下标志寄存器是16位的,入栈出栈指令分别是PUSHF,POPF

PUSHAD:把八个32位通用寄存器按序全部压入堆栈

入栈顺序:EAX,ECX,EDX,EBX,ESP原值,EBP,ESI,EDI,POPAD是以上序反序从堆栈中依次弹出值到八个32位通用寄存器中

PUSHA和POPA是上述寄存器对应的16位寄存器的入栈和出栈指令

掌握过程(procedure)的定义和调用

过程:相当于函数

PROC 伪指令:一般过程应该有返回指令 ret。但对于启始过程,需要采用操作系统提供的方法结束启始过程以返回到操作系统、Win32下,需要调用API函数ExitProcess

向过程传递参数:通过通用寄存器传递参数、通过堆栈传递参数

理解CALLRET指令对栈的影响,以及其对EIP的影响

CALL和RET指令:将EIP压栈(即当前CALL指令的下一条指令的地址),然后将过程名所在地址赋给EIP(相当于跳转到过程名所在的代码处)、在过程需要返回的地方,让其执行RET 指令。RET指令是从栈中取出32位地址,赋给EIP

了解USES的使用

USES操作符:是在定义过程时,可以在proc 后跟uses操作符,然后再跟要保护的寄存器列表(用空格或制表符分隔)。

功能:指示汇编器在过程开始时添加压栈指令(压栈的顺序即为uses操作符后面跟的寄存器顺序);在过程结束时加出栈指令

第六章:条件处理

掌握布尔运算指令(ANDORXORNOT)和比较指令CMP,以及TEST指令

AND指令:把源操作数和目的操作数对各二进制位按位与,结果存到目的操作数中。

两个操作数可以是8位,16位,32位,尺寸必须相同、运算规则为两个数据位均为1,结果为1,否则结果为0、影响的标志:清除CF和OF,依据目的操作数设置SF,ZF,PF

AND指令的用途举例:

1、清除选定的位,并同时保留其他位(如要对某个数中的某几位清0,其他位不变,则可以让这个数跟某个数相与:要清零的位设置为0,不变的位设置为1。

如要获取某字节里的低四位值,就可以将这个字节与00001111B这个数相与,相与的结果就是原数的高四位清0,低四位保持不变)

2、将小写字母转换成大写字母(同一字母的大写字母和小写字母的ASCII码的区别只在第5位不同,其他各位相同,小写字母第5位为1,大写字母第5位为0、如要把小写转大写,则可将小写的ASCII码与11011111B相与)

OR指令:或功能;指令格式与AND指令相同

运算规则:两个运算的位中只要有一位为1,结果就为1,两位全为0,结果为0

对标志位的影响与AND指令相同、通过OR指令可以对特定位置1

XOR指令:异或功能;指令格式与AND指令相同。

运算规则:参与运算的两位相同,结果为0,两位不同,结果为1

对标志位的影响与AND指令相同、异或运算的一个特点:某个操作数与同一个操作数异或两次,其值保持不变。利用这个特性可以实现加密

异或指令应用举例:

1、检查一个数的奇偶性(将此数与0相异或,此数值保持不变,而标志寄存器中的PF位反映这个数的奇偶性(为偶数个时PF为置1))

2、16位值的奇偶性(可以把这个16位值分成高低8位,让这高低8位异或,其8位结果的奇偶性与16位值的奇偶性相同)

NOT指令:对目的操作数各位按位取反,结果存到目的操作数中,不影响标志位

TEST 指令:将两操作数按位执行相“与”操作,结果不存到目的操作数,但标志寄存器中的标志位体现结果的属性、指令格式与AND指令相同,对标志位的影响也与AND指令一样、TEST指令常用来测试一个数中的特定位是否为1

TEST指令应用举例:

1、测试多个位是否至少有一位为1(如果关心一个数(设这个数为A)中的某些位是否为1,可以把要测试的这个数与另一个数(设这个数为B)作“与”运算。这里的B的设置方法为:关心的位设成1,不关心的位设成0,相与的结果,如果关心的位全为0,则ZF为1,如果关心的位中有一位为1,则ZF为0,ZF与不关心的位没有关系)

CMP指令:对两个操作数作相减运算,不修改操作数,但会影响标志位、指令格式与AND指令相同、高级语言中的if语句,类似于先执行CMP 指令,再执行一条条件跳转指令。

对标志位的影响:会修改OF、SF、ZF、CF、AF、PF

了解CLCSTC指令的功能

CLC指令:将CF清0

STC指令:将CF置1

理解数字符号与数字的关系,如数字1与数字符号1,对于后者存在计算机中使用的是它的ASCII代码31h。要求能应用在编程中。

掌握条件跳转指令的使用,并能根据数的符号的有无选择正确的条件跳转指令。

基于特定的标志位:

每个标志位对应两条指令,一是标志为真时跳转,一是标志为假时跳转(不含辅助进位)

JZ        JNZ

JC       JNC

JO       JNO

JS       JNS

JP       JNP

基于判定两操作数是否相等的:

JE              实际与JZ指令等价

JNE           实际与JNZ指令等价

JCXZ         如果CX寄存器等于0,跳转

JECXZ    如果ECX寄存器等于0跳转

基于无符号操作数的比较结果的:

核心两条:

JA     大于则跳转(jump if above)

JB    小于则跳转(jump if below)

类似的:

JAE   大于或等于跳转

JBE   小于或等于跳转

JNA   不大于跳转(与JBE等价)

JNB   不小于跳转(与JAE等价)

JNBE  不小于或等于跳转(与JA等价)

JNAE  不大于或等于跳转(与JB等价)

基于有符号操作数的比较结果的:

核心两条:

JG     大于则跳转(jump if greater)

JL    小于则跳转(jump if less)

类似的:

JGE   大于或等于跳转

JLE   小于或等于跳转

JNG   不大于跳转(与JLE等价)

JNL   不小于跳转(与JGE等价)

JNLE  不小于或等于跳转(与JG等价)

JNGE  不大于或等于跳转(与JL等价)

掌握LOOPZ/LOOPE/LOOPNZ/LOOPNE的使用

LOOPZ:指令格式:LOOPZ 目的地址,LOOPE与LOOPZ等价

循环条件:ECX不等于0并且ZF标志位为1时跳转,即与LOOP指令不同的地方就是要同时判别ZF标志位、目的地址跟当前指令的距离在-128~127之间;

LOOPNZ与LOOPZ类似,只是循环条件是ECX不等于0并且ZF标志位为0时跳转

不作要求:条件结构、决策伪指令

第七章:整数算术指令

掌握移位和循环移位指令SHLSHRSALSARROLRORRCLRCR的使用,了解指令SHLDSHRD

SHA指令:对目的操作数执行左移操作,最低位补0,移出的最高位送入进位标志CF,原来的进位位将丢失。SHL和SAL功能完全一样

SHR指令:将目的操作数逻辑右移,左边空出的位添0,右边最低位被移出,复制到CF位中、指令格式与SHL相同,可以实现无符号数的快速除法

SAR指令:在右移的过程中,最高位保持不变、格式、限制与SHR等相同

ROL/ROR/RCL/RCR 指令:循环移位是从移出的位又送回到另一端,格式与SHL相同;ROL/ROR可以实现位组交换,如一个字节8位,循环移位4次,则高低4位互换

SHLD/SHRD指令:是从386开始引入的、三操作数指令,将目的操作数移位。源操作数自身值不改变。 左移时,用源操作数的高位填充目的操作数的低位;右移时,用源操作数的低位填充目的操作数的高位;

 

掌握乘法和除法运算指令MULDIVIMULIDIV的使用

MUL指令:无符号乘法,当结果的高半部分为非0时,CF和OF置位,否则清0

指令中只有一个操作数,另一个操作数是隐含的(当操作数8位时,表示这个8位数与AL相乘,结果放在AX中;当操作数是16位时,表示这个16位数与AX相乘,结果放在DX和AX中,DX中放高16位,AX中放低16位;当操作数是32位时,表示这个32位数与EAX相乘,结果放在EDX和EAX中,EDX中放高32位,EAX中放低32位)

IMUL指令:有符号乘法,这条指令的操作数分成单操作数,双操作数,三操作数三种

单操作数:功能与MUL类似,只是把指令中的这个操作数和另一个隐含的操作数均看成有符号数、如果结果的高半部分不是低半部分的符号扩展,OF,CF置位

双操作数:两个操作数相乘,结果存到第一个操作数中、如果第一个操作数存不下结果,OF、CF置位。

三操作数:功能:第二、三两个操作数相乘,结果存到第一个操作数中、如果第一个操作数存不下结果,OF、CF置位。

DIV指令:无符号除法;实现整除运算,结果包括两项:一项为商,一项为余数

IDIV指令:有符号整数除法;有符号除法和无符号除法的用法基本相似。但要注意的是在进行除法操作前往往要进行符号扩展

符号扩展指令:共有三条符号扩展指令,其操作数在指令中不给出,均为隐含的寄存器

CBW   将AL符号扩展到AX

CWD   将AX符号扩展到DX:AX

CDQ    将EAX符号扩展到EDX:EAX

掌握扩展加减法

ADC指令:带进位加;将两个操作数与进位位一起相加,结果存放到目的操作数中。与ADD指令的差别就是在加的时候,包含了进位位(CF)的值一起相加。格式与ADD相同

SBB  指令:带借位减;将目的操作数减去源操作数,再减进位位,结果存到目的操作数中;格式与ADC相同

(无需了解调整指令)

其他

左移是一种特殊的快速乘法,左移n位,相当于乘以2n;

算术右移可以实现有符号数的快速除法

多次移位:当移位数不为1时,称作多次移位。对于多次移位,进位标志中的值是最后移出最高有效位的数据位

第八章: 高级过程

掌握堆栈框架(Stack Frame)的使用:栈框架的建立,栈的清理,要求能画出栈在调用一个过程中的变化情况;

CPU中用到堆栈的地方:通过PUSH和POP指令利用堆栈保存和恢复寄存器、变量等

CALL利用堆栈存放返回地址供RET指令使用、使用堆栈传递子过程参数、利用堆栈实现局部变量

堆栈传递参数,参数的两种类型:值参数(变量或常量的值)、引用/指针参数(变量的地址)

堆栈的清理:因为在调用子过程前,给堆栈压入了一些内容,在子过程返回时,必须调整堆栈指针;调整的方法有两种:在调用完子过程后通过加法指令改变ESP值、通过 RET imm 指令的形式

堆栈帧的创建步骤:

如果有需传递的参数,将各参数依次用PUSH压栈

通过CALL调用子过程,此指令自动将返回地址压栈

子过程开始,将EBP压栈

把ESP的值传给EBP,后续指令通过EBP访问堆栈空间,可以访问子过程的参数

如果有局部变量,则将ESP减去一个值,为局部变量保留空间。这些空间一样可以通过EBP来访问。

再对其他需要保存的寄存器压栈

理解通过栈传递参数的原理,能结合EBP来计算参数的位置

理解C调用约写与stdcall调用约定的不同点与相同点

C约定方式:参数按函数中参数从右到左依次入栈、子过程中不处理堆栈调整,由调用者自己调整、支持可变参数个数,如printf函数,每次调用时参量个数可能不同

stdcall调用约定:参数按函数表中参数从右到左依次入栈、通过在子过程中采用ret imm的方式调整堆栈、Windows API采用这种方式。所以,我们在win32的汇编里一般采用stdcall约定

理解如何在过程中使用局量变量

高级语言(如C语言)的局部变量有明显的优点、只在过程内可见、存储空间在过程结束时即释放、不同过程中局部变量名可以相同但不冲突、递归、多线程中,局部变量也有很重要的作用

掌握LEAENTERLEAVE指令的

LEA 指令:返回间接操作数的偏移地址,是在执行阶段取得偏移地址

ENTER指令:Enter  numBytes , nestlevel第二个参数指明嵌套级别。只看为0的情况

LEAVE指令:LEAVE指令一般是与Enter指令配合,enter是子过程的第一句话,leave则是ret前的最后一句话;

了解Local伪指令

local 伪指令:定义局部变量,可以提高代码的可读性、支持在一个过程中通过local伪指令定义一个或多个局部变量、Local必须紧跟在proc指令之后

掌握invoke伪指令的使用,理解它是如何转换为call指令的。

INVOKE伪指令:支持堆栈参数传递、一个invoke指令会替换成一系列的压栈指令和call指令;参数类型(立即数、整数表达式、变量名、地址表达式、寄存器、ADDR 变量名、Offset 变量名)

了解proto伪指令。

proto伪指令:声明过程原型;要使用invoke时,就要声明原型;支持参数检查(检查参数的数量和简单的类型匹配)

第九章:串操作

掌握串操作指令MOVSCMPSSCASSTOSLODS的使用

MOVS指令:MOVS指令把ESI指向的内存内容复制到EDI指向的内存单元中(相当于mov [edi],[esi]),ESI和EDI两个寄存器的值同时增加或减少,如DF位为0,则增加,否则,则减少。

CMPS:将ESI指向的内存同EDI指向的内存相比较(相当于cmp [esi],[edi]--但cmp指令两操作数不能同时为内存操作数,这儿只是表明意思),同时修改ESI和EDI的值。一般会跟repe或repne前缀,比较两个串是否相等

SCAS:SCASB指令将AL的值与EDI指向的内存内容相比较(相当于cmp AL , [edi]),即相当于是做查找操作,通常会跟重复前缀、如果使用repe前缀,则将查找到EDI开始的内存中第一个不等于AL时中止重复、如果使用repne前缀,则将查找到EDI开始的内存中第一个等于AL时中止重复、当然,如果ecx减到0,也会结束查找、SCASW是用AX作字查找,SCASD是用EAX作双字查找

STOS:是将累加器的内容存储到edi指向的内存单元中。同时edi的值修改、Stosb是存储AL,stosw存储AX,stosd存储EAX、如果使用rep前缀,则可以对一段内存进行填充。

LODS:将从esi指向的内存内容取出存到累加器中,同时,修改esi的值、Lodsb是取出一个字节存到AL中,lodsw是取出一个字存到AX中,lodsd是取出一个双字存到EAX中、该指令一般不会跟重复前缀。

理解基址变址寻址,相对基址变址寻址,了解比例因子

基址-变址寻址方式:把两个寄存器的值相加,得到的和作为偏移地址、两个寄存器第一个称作基址,另一个称作变址。在32位模式下,基址和变址可以使用任意通用的32位寄存器;在16位模式下,基址只能是BX或BP,变址只能是SI或DI

比例因子:变址部分可以乘以一个比例因子、比例因子只能是1,2,4,8。对于非字节数组,比例因子可以方便采用下标的方式进行数组访问。

基址-变址-偏移操作数:是将指令中的偏移地址、基址寄存器、变址寄存器三者之和作为访问的地址、变址部分还可以乘上一个比例因子

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

FLy_鹏程万里

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值