大学课程《汇编语言程序设计—基于x86与MIPS架构》PPT课件:第4章 x86汇编程序设计.ppt
《大学课程《汇编语言程序设计—基于x86与MIPS架构》PPT课件:第4章 x86汇编程序设计.ppt》由会员分享,可在线阅读,更多相关《大学课程《汇编语言程序设计—基于x86与MIPS架构》PPT课件:第4章 x86汇编程序设计.ppt(90页珍藏版)》请在冰点文库上搜索。
80x86汇编语言程序设计汇编语言程序设计第四章80x86汇编语言程序设计C语言程序的机器级表示顺序程序设计C语言分支语句的机器级表示和程序设计C语言循环语句的机器级表示和程序设计计算机逆向技术2北方工业大学信息学院4.1C语言程序的机器级表示程序编码过程调用指令CALL和过程返回指令RET过程调用伪指令参数传递局部变量3北方工业大学信息学院C语言程序的机器级表示4北方工业大学信息学院程序编码程序编码机器级编程,涉及两种重要的抽象:
指令集体系结构(ISA),来定义机器级程序的格式和行为,定义了处理器的状态、指令格式,以及每条指令对状态的影响。
程序使用的内存地址是虚拟地址,提供的内存模型看上去是一个非常大的字节数组,存储器系统的实际实现是将多个硬件存储器和操作系统软件组合起来。
C语言等高级语言与汇编语言及机器语言之间是一对多的关系。
一条简单的C+语句会被扩展成多条汇编语言或者机器语言指令。
C语言程序的机器级表示5北方工业大学信息学院过程调用指令过程调用指令CALLCALL和过程返回指令和过程返回指令RETRET在汇编语言中,常把子程序称为在汇编语言中,常把子程序称为过程过程(procedureprocedure)。
)。
CC语言中的函数是语言中的函数是子程序子程序,也就是汇编语言中的,也就是汇编语言中的过程过程。
调用调用子程序(过程、函数)在本质上是控制转移子程序(过程、函数)在本质上是控制转移,它与无条,它与无条件转移的区别是调用子程序要考虑返回。
件转移的区别是调用子程序要考虑返回。
处理器提供专门的处理器提供专门的过程调用指令过程调用指令CALL和过程返回指令和过程返回指令RETC语言程序的机器级表示6北方工业大学信息学院子程序子程序与主程序分开、完成特定功能与主程序分开、完成特定功能的一的一段程序段程序主程序主程序(调用程序调用程序)执行调用指令执行调用指令CALLCALL调用子程序调用子程序子程序(被调用程序)执行返回指令执行返回指令RETRET返回主程序返回主程序C语言程序的机器级表示7北方工业大学信息学院CALLlabelLABELLABEL可以是程序中的一个标号,也可以是一个过程名。
可以是程序中的一个标号,也可以是一个过程名。
具体操作:
具体操作:
把把返回地址返回地址偏移(偏移(EIPEIP内容)压入堆栈内容)压入堆栈使得使得EIPEIP之内容为之内容为目标地址目标地址偏移,从而实现转移偏移,从而实现转移返回地址:
紧随过程调用指令的下一条指令的地址(有效地址返回地址:
紧随过程调用指令的下一条指令的地址(有效地址)目标地址:
子程序开始处的地址(有效地址)目标地址:
子程序开始处的地址(有效地址)段内直接段内直接调用指令调用指令C语言程序的机器级表示8北方工业大学信息学院RETRET指令用于从指令用于从子程序子程序返回到返回到主程序主程序。
执行该指令时,从堆栈顶弹出返回地址,送到指令指针寄存器执行该指令时,从堆栈顶弹出返回地址,送到指令指针寄存器EIPEIPRET段内返回段内返回指令指令C语言程序的机器级表示9北方工业大学信息学院执行过程段内调用指令时执行过程段内调用指令时堆栈变化示意图堆栈变化示意图返回地址是CALL指令下一条指令的地址,被保存在堆栈中对错AB提交单选题1分子程序最后,通常需要执行的返回指令是()CALLLOOPJZRETABCD提交单选题1分C语言程序的机器级表示12北方工业大学信息学院过程定义伪指令过程定义伪指令;过程体过程体过程名过程名PROCPROC过程名过程名ENDPENDP;过程名为符合语法的标识符过程名为符合语法的标识符利用过程定义伪指令获得子程序信息利用过程定义伪指令获得子程序信息;PROCPROC后面可加参数:
后面可加参数:
NEARNEAR或或FARFARNEAR属性(段内近调用):
调用程序和子程序在同一代码段中,只能被相同代码段的其他程序调用;FAR属性(段间远调用):
调用程序和子程序不在同一代码段中,可以被相同或不同代码段的程序调用.C语言程序的机器级表示13北方工业大学信息学院参数传递参数传递主程序与子程序间通过参数传递建立联系主程序与子程序间通过参数传递建立联系入口参数入口参数(输入参数输入参数):
主程序:
主程序子程序子程序出口参数出口参数(输出参数输出参数):
子程序:
子程序主程序主程序一一般般而而言言,子子程程序序既既有有入入口口参参数数,又又有有出出口口参参数数。
但但有有的的子子程程序序只只有有入入口口参参数数,而而没没有有出出口口参参数数;少少数数子子程程序序只只有有出出口口参参数数,而而没没有有入入口口参参数。
数。
C语言程序的机器级表示14北方工业大学信息学院多种传递参数的方法多种传递参数的方法寄存器传递法、堆栈传递法、约定内存单元传递法和CALL后续区传递法等。
特点:
实现简单和调用方便。
但只适用于传递参数较少的情形。
寄存器传递参数寄存器传递参数就是把参数放在约定的寄存器中。
就是把参数放在约定的寄存器中。
堆栈传递参数堆栈传递参数不占用寄存器,也无需额外的存储单元。
但较为复杂。
不占用寄存器,也无需额外的存储单元。
但较为复杂。
C语言程序的机器级表示15北方工业大学信息学院CC语言函数的目标代码,通常利用语言函数的目标代码,通常利用堆栈传递堆栈传递入口参数,而入口参数,而利用利用寄存器传递寄存器传递出口参数。
出口参数。
使使用用堆堆栈栈传传递递入入口口参参数数,主主程程序序在在调调用用子子程程序序之之前前,把把需需要要传传递递的的参参数数依依次次压压入入堆堆栈栈,然然后后子子程程序序从从堆堆栈栈中中取取入入口口参数。
参数。
过程调用时,入口参数必须使用堆栈传递。
对错AB提交单选题1分C语言程序的机器级表示17北方工业大学信息学院【例例4.14.1】CC语言源程序计算表达式语言源程序计算表达式#includeintcfg2(intx,inty)与与cfg1cfg1函数相同,函数相同,但没有调用约定但没有调用约定_fastcall_fastcallreturn(2*x+5*y+100);intmain()intval;val=cfg2(23,456);printf(val=%dn,val);return0;C语言程序的机器级表示18北方工业大学信息学院函数函数mainmain的目标代码的目标代码_mainPROC;过程开始过程开始;val=cfg2(23,456)push456;把参数把参数y(000001c8H)压入堆栈)压入堆栈push23;把参数把参数x(00000017H)压入堆栈)压入堆栈callcfg2;调用函数调用函数cfg2;printf(val=%dn,val)pusheax;把把val值压入堆栈值压入堆栈pushOFFSETFMTS;把输出格式字符串首地址压入堆栈把输出格式字符串首地址压入堆栈call_printf;调用库函数调用库函数_printfxoreax,eax;由由eax传递返回值传递返回值ret;返回返回C语言程序的机器级表示19北方工业大学信息学院函数函数cfg2cfg2的目标代码的目标代码cfg2PROCpushebpmovebp,esp(2*x+5*y+100);过程开始过程开始;把把EBP压入堆栈压入堆栈;使得使得EBP指向栈顶指向栈顶C语言程序的机器级表示20北方工业大学信息学院堆栈参数分析堆栈参数分析堆栈变化示意图堆栈变化示意图C语言程序的机器级表示21北方工业大学信息学院函数函数cfg2cfg2的目标代码的目标代码(2*x+5*y+100)cfg2PROCpushebpmovebp,espmoveax,DWORDPTRebp+12movecx,DWORDPTRebp+8leaeax,DWORDPTReax+eax*4+100leaeax,DWORDPTReax+ecx*2popebpretcfg2ENDP;过程开始过程开始;把把EBP压入堆栈压入堆栈;使得使得EBP指向栈顶指向栈顶;从堆栈取参数从堆栈取参数y;从堆栈取参数从堆栈取参数x;EAX=5*y+100;EAX=EAX+2*x;恢复恢复EBP;返回返回;过程结束过程结束C语言程序的机器级表示22北方工业大学信息学院局部变量局部变量C语言程序的机器级表示23北方工业大学信息学院【例例4.24.2】CC语言过程:
局部变量语言过程:
局部变量zzintcfg3(intx,inty)/求最大值求最大值intz;z=x;if(xy)z=y;returnz;C语言程序的机器级表示24北方工业大学信息学院对应的目标代码:
对应的目标代码:
cfg3PROCpushebpmovebp,esppushecx;表示过程(函数)开始表示过程(函数)开始;建立堆栈框架建立堆栈框架;在堆栈中安排局部变量在堆栈中安排局部变量zC语言程序的机器级表示25北方工业大学信息学院局部变量堆栈参数分析局部变量堆栈参数分析C语言程序的机器级表示26北方工业大学信息学院对应的目标代码:
对应的目标代码:
cfg3PROC;表示过程(函数)开始表示过程(函数)开始pushebpmovebp,esppushecx;建立堆栈框架建立堆栈框架;在堆栈中安排局部变量在堆栈中安排局部变量z;z=x;取得形参取得形参x;送到变量送到变量z;if(x=A&ch=A&ch=A&ch=A&ch=A&ch=Z)ebp+8参数chcmpecx,25两次比较转化为一次比较jaSHORTLN1cff1;ch+=0x20;addeax,32LN1cff1:
popebpret;returnch;撤销堆栈框架C语言分支语句的机器级表示和程序设计39北方工业大学信息学院简单分支结构优化要点简单分支结构优化要点减少一次分支转移,合并为判断是否属于减少一次分支转移,合并为判断是否属于0,y-x0,y-xmoveax,DWORDPTRebp+8leaecx,DWORDPTReax-65cmpecx,25jaSHORTLN1cff1充分利用寄存器,提高执行效率的手段充分利用寄存器,提高执行效率的手段C语言分支语句的机器级表示和程序设计40北方工业大学信息学院【例例4.54.5】把一位十六进制数转换为对应把一位十六进制数转换为对应ASCIIASCII码码对应关系可表示为一个分段函数:
对应关系可表示为一个分段函数:
C语言分支语句的机器级表示和程序设计41北方工业大学信息学院CC函数:
函数:
if-elseif-else结构结构intcff2(intm)m=m&0x0f;if(m10)m+=0x30;elsem+=0x37;returnm;/入口参数为一位十六进制数/确保一位十六进制数(在0-15之间)/数字符0-9/字母A-FC语言分支语句的机器级表示和程序设计42北方工业大学信息学院函数函数cff2cff2目标代码(编译不优化)目标代码(编译不优化)pushebpmovebp,espmoveax,DWORDPTRebp+8andeax,15movDWORDPTRebp+8,eax;if(m10)cmpDWORDPTRebp+8,10jgeSHORTLN2cff2;建立堆栈框架;m=m&0x0f;intcff2(intm)m=m&0x0f;if(m10Nm=m&0fhJMPC语言分支语句的机器级表示和程序设计44北方工业大学信息学院采用编译优化选项使采用编译优化选项使速度最大化速度最大化,函数,函数cff2cff2目标代码为:
目标代码为:
pushebpmovebp,espmoveax,DWORDPTRandcmpjgeaddpopebpebp+8eax,15eax,10SHORTLN2cff2eax,48retLN2cff2:
addeax,55popebpret;建立堆栈框架;m=m&0x0f;ebp+8为参数m;if(m9)m+=7;returnm;C语言分支语句的机器级表示和程序设计48北方工业大学信息学院采用编译优化选项使速度最大化,函数采用编译优化选项使速度最大化,函数cff3cff3目标代码为:
目标代码为:
pushebpmovebp,espmoveax,DWORDPTRebp+8andaddcmpeax,15eax,48eax,57;m=m&0x0f;m+=0x30;if(m9)jleSHORTLN1cff3只有一个条件转移指令addeax,7LN1cff3:
popebpret;m+=7;C语言分支语句的机器级表示和程序设计49北方工业大学信息学院【例例4.64.6】判断数据最高位程序,编写汇编程序实现判断数据最高位程序,编写汇编程序实现CDQCDQ指令功能指令功能:
C语言分支语句的机器级表示和程序设计50北方工业大学信息学院dvardword0ef04587ahmoveax,dvarshleax,1jconemovedx,0jmptwomovedx,0ffffffffhone:
two:
.;显示显示C语言分支语句的机器级表示和程序设计51北方工业大学信息学院moveax,dvarmovedx,0shleax,1jnconemovedx,0ffffffffh.one:
在if-then-else分支绪构对应的机器级代码的表示中,一定包含一条条件转移指令。
对错AB提交单选题1分C语言分支语句的机器级表示和程序设计53北方工业大学信息学院多分支结构多分支结构CC语言中用语言中用switchswitch语句实现多分支语句实现多分支C语言分支语句的机器级表示和程序设计54北方工业大学信息学院【例例4.74.7】switchswitch语句举例语句举例C语言分支语句的机器级表示和程序设计55北方工业大学信息学院采用编译优化选项使采用编译优化选项使速度最大化速度最大化,函数,函数cff4cff4目标代码为:
目标代码为:
LN12cff4:
DDLN6cff4DDLN5cff4DDLN2cff4DDLN4cff4;case4DDLN4cff4;case5DDLN2cff4;defaultDDLN2cff4;defaultDDLN3cff4;case8;多向分支目标地址表多向分支目标地址表;case1;case2case1:
LN12cff4case1:
LN12cff4case2:
LN12cff4+case2:
LN12cff4+11*4*4case3:
LN12cff4+case3:
LN12cff4+22*4*4casen:
LN12cff4+casen:
LN12cff4+(n-1(n-1)*4)*4LN12cff4LN12cff4地址表(每项地址表(每项44字节)字节)C语言分支语句的机器级表示和程序设计56北方工业大学信息学院pushebpmovebp,espmoveax,DWORDPTRebp+12deceaxcmpeax,7jaSHORTLN2cff4;jmp;DWORDPTRLN12cff4eax*4LN12cff4+eax*4;switch(operation);取得参数取得参数operation(case值)值);从从0开始计算,所以先减去开始计算,所以先减去1;从从0开始计算,最多就是开始计算,最多就是7;超过,则转超过,则转default;实施多路分支实施多路分支C语言分支语句的机器级表示和程序设计57北方工业大学信息学院LN6cf3f4:
;case1:
;y=3*x;moveax,DWORDPTRebp+8leaeax,DWORDPTReax+eax*2ebp+8ebp+8参数参数xxjmpSHORTLN7cff4;break;BreakBreak语句的代码语句的代码;LN5cf3f4:
;case2:
;y=5*x+6;moveax,DWORDPTRebp+8leaeax,DWORDPTReax+eax*4+6jmpSHORTLN7cff4;break;intcff4(intx,intoperation)inty;switch(operation)case1:
y=3*x;break;case2:
y=5*x+6;break;情形情形11和和22处理的对应代码处理的对应代码C语言分支语句的机器级表示和程序设计58北方工业大学信息学院LN4cff4:
moveax,DWORDPTRebp+8imuleax,eaxjmpSHORTLN7cff4;LN3cff4:
movecx,DWORDPTRebp+8leaeax,DWORDPTRecx+4imuleax,ecxjmpSHORTLN7cff4;case5:
;y=x*x;break;case8:
;y=x*x+4*x=x*(x+4);break;case5:
y=x*x;break;case8:
y=x*x+4*x;break;C语言分支语句的机器级表示和程序设计59北方工业大学信息学院LN2cff4:
moveax,DWORDPTRebp+8;LN7cff4:
cmpeax,1000jleSHORTLN1cff4;y=1000;moveax,1000LN1cff4:
popebpret;default:
;y=x;if(y1000);returny;撤销堆栈框架撤销堆栈框架default:
y=x;if(y1000)y=1000;returny;在switch语句的机器级代码的表示中,每个case对应的一段代码结束后,都会有一条无条件转移指令。
对错AB提交单选题1分第四章80x86汇编语言程序设计C语言程序的机器级表示顺序程序设计C语言分支语句的机器级表示和程序设计C语言循环语句的机器级表示和程序设计计算机逆向技术61北方工业大学信息学院4.4C语言循环语句的机器级表示和程序设计循环语句的机器级表示循环程序设计示例双重循环程序设计62北方工业大学信息学院C语言循环语句的机器级表示和程序设计63北方工业大学信息学院循环通常有三部分组成循环通常有三部分组成循环初始化、循环体、循环控制循环初始化、循环体、循环控制两种结构两种结构:
“先执行、后判断先执行、后判断”:
do-while:
do-while“先判断、后循环先判断、后循环”:
while-do:
while-do,forfor常用计数控制循环和条件控制循环常用计数控制循环和条件控制循环C语言循环语句的机器级表示和程序设计64北方工业大学信息学院do-whiledo-while”语句的机器级表示语句的机器级表示【例例4.84.8】:
统计无符号整数:
统计无符号整数n作为十进制数时的位数作为十进制数时的位数intcfx1(unsignedintn)intlen=0;dolen+;n=n/10;while(n!
=0);returnlen;C语言循环语句的机器级表示和程序设计65北方工业大学信息学院采用编译优化选项使采用编译优化选项使大小最小化大小最小化,函数,函数cfx1cfx1目标代码为:
目标代码为:
pushebpmovebp,espxorecx,pushesiLL3cfx1:
;ECX作为作为len;len=0;在使用在使用ESI之前,保护之之前,保护之;do;len+moveax,DWORDPTRpush10;n=n/10;ebp+8xoredx,edxpopesidivesi;准备借助堆栈送到准备借助堆栈送到ESI;使得使得EDX=0,为除法做准备,为除法做准备;使得使得ESI=10ECXECX作为局部变量作为局部变量lenecxebp+8ebp+8参数参数nn;EAX=EDX.EAXESI的商intcfx1(unsignedintn)intlen=0;dolen+;n=n/10;while(n!
=0);returnlen;moveax,ecx;returnlen;准备返回值准备返回值popesi;恢复恢复ESI;popebpretintcfx1(unsignedintn)intlen=0;dolen+;n=n/10;while(n!
=0);returnlen;C语言循环语句的机器级表示和程序设计66北方工业大学信息学院incecxmovDWORDPTRebp+8,eaxtesteax,eaxjneSHORTLL3cfx1;len+;while(n!
=0);测试测试n是否为是否为0?
C语言循环语句的机器级表示和程序设计67北方工业大学信息学院C语言编译优化要点语言编译优化要点C语言循环语句的机器级表示和程序设计68北方工业大学信息学院“while-dowhile-do”语句的机器级表示语句的机器级表示【例例4.94.9】测量字符串测量字符串str的长度的长度intcfx2(char*str)char*pc=str;while(*pc)pc+;return(pcstr);C语言循环语句的机器级表示和程序设计69北方工业大学信息学院采用编译优化选项使采用编译优化选项使大小最大化大小最大化,函数,函数cfx2cfx2目标代码为:
目标代码为:
pushebpmovebp,espmovecx,DWORDPTRmoveax,ecxebp+8;建立堆栈框架建立堆栈框架;取出取出str存放到存放到ECX;pc=str;while(*pc)ebp+8ebp+8参数参数strstrcmpBYTEPTRecx,0jeSHORTLN1cfx2;判断首字符是否为结束标记判断首字符是否为结束标记;如果遇结束标记,结束循环如果遇结束标记,结束循环intcfx2(char*str)char*pc=str;while(*pc)pc+;return(pcstr);C语言循环语句的机器级表示和程序设计70北方工业大学信息学院LL2cfx2:
inceax;pc+;cmpBYTEPTReax,0;while(*pc)避免避免JMP指令指令jneSHORTLL2cfx2;如果未遇结束标记,继续循环如果未遇结束标记,继续循环LN1cfx2:
subeax,ecxpopebpret;return(pc-str);intcfx2(char*str)char*pc=str;while(*pc)pc+;return(pcstr);C语言循环语句的机器级表示和程序设计71北方工业大学信息学院编译优化要点编译优化要点C语言循环语句的机器级表示和程序设计72北方工业大学信息学院for循环控制语句循环控制语句机器级表示机器级表示【例例4.104.10】计算一个整型数组中元素的平均值计算一个整型数组中元素的平均值入口参数入口参数:
数组和元素个:
数组和元素个数数n局部变量局部变量:
循环控制变:
循环控制变量量i统计元素和统计元素和sumintcfx3(intarr,intn)inti,sum=0;for(i=0;in;i+)sum+=arri;returnsum/n;C语言循环语句的机器级表示和程序设计73北方工业大学信息学院采用编译优化选项使采用编译优化选项使大小最大化大小最大化,函数,函数cfx3目标代码为:
目标代码为:
pushebpmovebp,espxorecx,ecxxoreax,eaxcmpDWORDPTRebp+12,ecxjleSHORTLN1cfx3;i=0;sum=0;in?
;比较比较n与与iECXECX作为变量作为变量iiEAXEAX作为变量作为变量sumsum;如果如果n=i则结束循环则结束循环intcfx3(intarr,intn)inti,sum=0;for(i=0;in;i+)sum+=arri;returnsum/n;73C语言循环语句的机器级表示和程序设计74LL3cfx3:
movedx,DWORDPTRebp+8addeax,DWORDPTRedx+ecx*4;EDX+ECX*4指向第指向第i个元素个元素;sum+=arri;EDX指向