资源描述:
《汇编语言的准备知识》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库。
1、汇编语言的准备知识ESI/EDI分别叫做"源/目标索引寄存器"(source/destinationindex),因为在很多字符串操作指令中,DS:ESI指向源串,而ES:EDI指向目标串.EBP是"基址指针"(BASEPOINTER),它最经常被用作高级语言函数调用的"框架指针"(framepointer).在破解的时候,经常可以看见一个标准的函数起始代码:pushebp;保存当前ebpmovebp,esp;EBP设为当前堆栈指针subesp,xxx;预留xxx字节给函数临时变量....这样一来,EBP构成了该函
2、数的一个框架,在EBP上方分别是原来的EBP,返回地址和参数.EBP下方则是临时变量.函数返回时作movesp,ebp/popebp/ret即可.ESP专门用作堆栈指针.2.段寄存器:CS(CodeSegment,代码段)指定当前执行的代码段.EIP(Instructionpointer,指令指针)则指向该段中一个具体的指令.CS:EIP指向哪个指令,CPU就执行它.一般只能用jmp,ret,jnz,call等指令来改变程序流程,而不能直接对它们赋值.DS(DATASEGMENT,数据段)指定一个数据段.注意:在当
3、前的计算机系统中,代码和数据没有本质差别,都是一串二进制数,区别只在于你如何用它.例如,CS制定的段总是被用作代码,一般不能通过CS指定的地址去修改该段.然而,你可以为同一个段申请一个数据段描述符"别名"而通过DS来访问/修改.自修改代码的程序常如此做.ES,FS,GS是辅助的段寄存器,指定附加的数据段.SS(STACKSEGMENT)指定当前堆栈段.ESP则指出该段中当前的堆栈顶.所有push/pop系列指令都只对SS:ESP指出的地址进行操作.3.标志寄存器(EFLAGS):该寄存器有32位,组合了各个系统标志
4、.EFLAGS一般不作为整体访问,而只对单一的标志位感兴趣.常用的标志有:进位标志C(CARRY),在加法产生进位或减法有借位时置1,否则为0.零标志Z(ZERO),若运算结果为0则置1,否则为0符号位S(SIGN),若运算结果的最高位置1,则该位也置1.溢出标志O(OVERFLOW),若(带符号)运算结果超出可表示范围,则置1.JXX系列指令就是根据这些标志来决定是否要跳转,从而实现条件分枝.要注意,很多JXX指令是等价的,对应相同的机器码.例如,JE和JZ是一样的,都是当Z=1是跳转.只有JMP是无条件跳转.J
5、XX指令分为两组,分别用于无符号操作和带符号操作.JXX后面的"XX"有如下字母:无符号操作:带符号操作:A="ABOVE",表示"高于"G="GREATER",表示"大于"B="BELOW",表示"低于"L="LESS",表示"小于"C="CARRY",表示"进位"或"借位"O="OVERFLOW",表示"溢出"S="SIGN",表示"负"通用符号:E="EQUAL"表示"等于",等价于Z(ZERO)N="NOT"表示"非",即标志没有置位.如JNZ"如果Z没有置位则跳转"Z="ZERO",与E同.如果仔细想一想
6、,就会发现JA=JNBE,JAE=JNB,JBE=JNA,JG=JNLE,JGE=JNL,JL=JNGE,....4.端口端口是直接和外部设备通讯的地方。外设接入系统后,系统就会把外设的数据接口映射到特定的端口地址空间,这样,从该端口读入数据就是从外设读入数据,而向外设写入数据就是向端口写入数据。当然这一切都必须遵循外设的工作方式。端口的地址空间与内存地址空间无关,系统总共提供对64K个8位端口的访问,编号0-65535.相邻的8位端口可以组成成一个16位端口,相邻的16位端口可以组成一个32位端口。端口输入输出由
7、指令IN,OUT,INS和OUTS实现,具体可参考汇编语言书籍。汇编指令的操作数可以是内存中的数据,如何让程序从内存中正确取得所需要的数据就是对内存的寻址.INTEL的CPU可以工作在两种寻址模式:实模式和保护模式.前者已经过时,就不讲了,WINDOWS现在是32位保护模式的系统,PE文件就基本是运行在一个32位线性地址空间,所以这里就只介绍32位线性空间的寻址方式.其实线性地址的概念是很直观的,就想象一系列字节排成一长队,第一个字节编号为0,第二个编号位1,....一直到4294967295(十六进制FFFFFF
8、FF,这是32位二进制数所能表达的最大值了).这已经有4GB的容量!足够容纳一个程序所有的代码和数据.当然,这并不表示你的机器有那么多内存.物理内存的管理和分配是很复杂的内容,初学者不必在意,总之,从程序本身的角度看,就好象是在那么大的内存中.在INTEL系统中,内存地址总是由"段选择符:有效地址"的方式给出.段选择符(SELECTOR)存放在某一个段寄存器