计算机系统-从应用程序到底层实现 课件 第9讲-程序的机器级表示:基本_第1页
计算机系统-从应用程序到底层实现 课件 第9讲-程序的机器级表示:基本_第2页
计算机系统-从应用程序到底层实现 课件 第9讲-程序的机器级表示:基本_第3页
计算机系统-从应用程序到底层实现 课件 第9讲-程序的机器级表示:基本_第4页
计算机系统-从应用程序到底层实现 课件 第9讲-程序的机器级表示:基本_第5页
已阅读5页,还剩28页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

《计算机系统》程序的机器级表示《计算机系统》课程教学组2025年春季学期从C代码到机器代码数据传送与寻址方式算术操作010203内容提要程序执行CPUPC:程序计数器下一条指令的地址记为“EIP”(IA32)or“RIP”(x86-64)寄存器文件一组寄存器Conditioncodes条件码是CPU根据运算结果由硬件设置的位,体现当前指令执行结果的各种状态信息是程序分支和程序循环的依据内存代码数据栈地址数据指令CPUPC寄存器文件条件码Conditioncodes条件码是CPU根据运算结果由硬件设置的位,体现当前指令执行结果的各种状态信息是程序分支和程序循环的依据内存字节数组代码与用户数据支持过程的栈从C到目标代码texttextbinarybinaryCompiler(gcc-S)Assembler(gccoras)Linker(gccorld)Cprogram(p1.cp2.c)Asmprogram(p1.sp2.s)Objectprogram(p1.op2.o)Executableprogram(p)Staticlibraries(.a)两个源代码文件p1.c

和p2.c,通过编译指令

gcc–O1p1.cp2.c-op进行编译,使用最基本的代码优化(-O1),二进制代码文件p。编译系统编译系统将高级语言变成机器指令不仅仅是翻译,还有语法检查、优化、链接等等编译系统的重要性不亚于操作系统中国独立自主的高性能编译系统神威“太湖之光”超级计算机申威64指令集、神威睿智编译器极其工具链、神威睿思操作系统……中国超算凭借独立成果多次占据世界超算榜首。中国独立自主的桌面操作系统

廖湘科院士

陈左宁院士

倪光南院士汇编代码CCodeintsum(intx,inty){intt=x+y;returnt;}GeneratedIA32Assemblysum: pushl%ebp movl%esp,%ebp movl12(%ebp),%eax addl8(%ebp),%eax popl%ebp ret某些编译器使用指令“leave”来打包出栈指令机器代码CCode两个有符号整数相加汇编将两个4字节整数相加有符号或无符号都是同一指令操作数:y:

寄存器

%eaxx:

内存

M[%ebp+8]t:

寄存器

%eax返回值保存在

%eax目标代码3-字节指令保存在地址

0x80483caintt=x+y;Addl8(%ebp),%eax0x80483ca:034508相似表达式:

x+=y更精确的表达:inteax;int*ebp;eax+=ebp[8]目标代码Codeforsum0x401040<sum>:0x550x890xe50x8b0x450x0c0x030x450x080x5d0xc3汇编器将.s文件转成.o文件每条指令都编码不同文件之间的联系没有体现链接解决文件之间的引用关系与静态链接库整合e.g.,codeformalloc,printf有些库是动态链接的(

dynamicallylinked)当程序开始执行时才链接一共有11个字节每条指令占1,2,or3个字节起始地址在0x0401040使用命令:gcc–O1-ccode.c–ocode.o得到文件:code.o目标代码code.o起始地址是动态分配的反汇编0x401040<sum>:0x401040:55push%ebp0x401041:89e5mov%esp,%ebp0x401043:8b450cmov0xc(%ebp),%eax0x401046:034508add0x8(%ebp),%eax0x401049:5dpop%ebp0x40104a:c3ret反汇编器(Disassembler):将目标代码编译回汇编代码objdump–dcode.o分析目标代码时的有效工具反汇编另一种反汇编方式0x401040:0x550x890xe50x8b0x450x0c0x030x450x080x5d0xc3目标代码使用GDBgdbpdisassemblesumx/11xbsum查看从sum函数地址开始的11个字节Dumpofassemblercodeforfunctionsum:0x080483c4<sum+0>:push%ebp0x080483c5<sum+1>:mov%esp,%ebp0x080483c7<sum+3>:mov0xc(%ebp),%eax0x080483ca<sum+6>:add0x8(%ebp),%eax0x080483cd<sum+9>:pop%ebp0x080483ce<sum+10>:rettest.s与反汇编代码gcc-Etest.c-otest.igcc-Stest.i-otest.s

orgcc–Stest.c–otest.s

add:pushl %ebpmovl %esp,%ebpsubl $16,%espmovl 12(%ebp),%eaxmovl 8(%ebp),%edxleal (%edx,%eax),%eaxmovl %eax,-4(%ebp)movl -4(%ebp),%eaxleaverettest.s00000000<add>:0:55 push%ebp1:89e5 mov%esp,%ebp3:83ec10sub$0x10,%esp6:8b450cmov0xc(%ebp),%eax9:8b5508mov0x8(%ebp),%edxc:8d0402lea(%edx,%eax,1),%eaxf:8945fcmov%eax,-0x4(%ebp)12:8b45fcmov-0x4(%ebp),%eax15:c9leave16:c3ret位移量机器指令汇编指令反汇编目标代码的结果两种目标文件反汇编对比objdump–dtest.o反汇编test.o文件内存地址机器指令汇编指令objdump–dtest反汇编可执行目标文件“test”00000000<add>:0:55push%ebp1:89e5mov%esp,%ebp3:83ec10sub$0x10,%esp6:8b450cmov0xc(%ebp),%eax9:8b5508mov0x8(%ebp),%edxc:8d0402lea(%edx,%eax,1),%eaxf:8945fcmov%eax,-0x4(%ebp)12:8b45fcmov-0x4(%ebp),%eax15:c9leave16:c3ret080483d4<add>:80483d4:55push...80483d5:89e5…80483d7:83ec10…80483da:8b450c…80483dd:8b5508…80483e0:8d0402…80483e3:8945fc…80483e6:8b45fc…80483e9:c9…80483ea:c3ret课堂思考从目标文件到可执行目标文件,主要的变化有哪些??从C代码到机器代码数据传送与寻址方式算术操作010203内容提要基本数据类型“整数”1,2,4,8bytes数据值地址(untypedpointers)—认真学习课程中心关于指针的讲课视频!浮点数4,8,or10bytes单精度(float:4bytes)双精度(double:8bytes)长双精度(longdoubleorextended:10bytes)数组与结构内存中一组连续分配的字节基本操作对寄存器或内存数据进行操作的运算类指令在内存与寄存器中之间传送数据的传送类指令将数据从内存加载到寄存器中将寄存器数据保存到内存中决定程序走向的控制类指令无条件/有条件跳转分支/循环IA32寄存器%eax%ecx%edx%ebx%esi%edi%esp%ebp%ax%cx%dx%bx%si%di%sp%bp%ah%ch%dh%bh%al%cl%dl%bl16-bit虚拟寄存器(为了向下兼容)通用寄存器accumulatecounterdatabasesourceindexdestinationindexstackpointerbasepointerOrigin(mostlyobsolete)传送数据IA32MOV指令movlSource,Dest:操作数类型Immediate:立即数

例:$0x400,$-533占用1,2,or4字节Register:8个整数寄存器之一例:%eax,%edx

%esp与%ebp保留作为特殊用途其他通用寄存器可能会在某些操作时有特定用途Memory:

内存地址简单例子:(%eax)有非常多的寻址模式%eax%ecx%edx%ebx%esi%edi%esp%ebp操作数组合没有内存到内存的数据传送指令movlImmRegMemRegMemRegMemRegSourceDestCAnalogmovl$0x4,%eaxtemp=0x4;movl$-147,(%eax)*p=-147;movl%eax,%edxtemp2=temp1;movl%eax,(%edx)*p=temp;movl(%eax),%edxtemp=*p;Src,Destpush与pop数据为int汇编格式区别:(1)Intel格式的指令助记符省略了指示数据大小的后缀;(2)Intel格式省略了寄存器名字前的%;(3)Intel格式指令中,源操作数在右边,目的操作数在左边。(与ATT正好相反)ATT格式 Intel格式movl(%ecx),%eax moveax,[ecx]movl(%ecx),%eaxmovl8(%ebp),%edx寄存器间接寻址(R) Mem[Reg[R]]寄存器R中存放了内存地址基址变址寻址D(R)Mem[Reg[R]+D]寄存器R中存放了内存的起始地址常数D给出了偏移量内存寻址内存寻址

Imm:常数1,2,or4bytes(偏移量)Eb

:基址寄存器Ei

:变址寄存器(不要用

%esp)S

:比例因子1,2,4,or8(whythesenumbers?)内存寻址%edx0xf000%ecx0x0100ExpressionAddressComputationAddress0x8(%edx)0xf000+0x80xf008(%edx,%ecx)0xf000+0x1000xf100(%edx,%ecx,4)0xf000+4*0x1000xf4000x80(,%edx,2)2*0xf000+0x800x1e080地址计算举例格式:lealSrc,DestSrc:地址计算表达式Src的结果保存在Dest中用途:计算内存地址值本身(不取内存里的值)e.g.,translationofp=&x[i];计算诸如x+k*y表达式的值k=1,2,4,or8举例lea寻址LEAintmul12(intx){returnx*12;}leal(%eax,%eax,2),%eax;t<-x+x*2sall$2,%eax;returnt<<2课堂习题1参看下图的寄存器信息和存储器信息,若操作数为0xF4(,%edx,4),则该寻址方式获得的值为:0XAB0X130XFF表中无正确值从C代码到机器代码数据传送与寻址方式算术操作010203内容提要算术操作指令双操作数指令:

格式

计算addl

Src,Dest Dest=Dest+Srcsubl

Src,Dest Dest=Dest-Srcimull

Src,Dest Dest=Dest*Srcsall

Src,Dest Dest=Dest<<Src(Arithmetic)shll

Src,Dest Dest=Dest<<Src(Logical)sarl

Src,Dest Dest=Dest>>Src(Arithmetic)shrl

Src,Dest Dest=Dest>>Src(Logical)xorl

Src,Dest Dest=Dest^Srcandl

Src,Dest Dest=Dest&Srcorl

Src,Dest Dest=Dest|Src

注意操作数的顺序!算术操作指令单操作数指令:

格式

计算inclDest

Dest=Dest+1declDest

Dest=Dest-1neglDest

Dest=-Dest (取补=各位取反后+1)notlDest

Dest=~Dest (取反=各位取反)

算术指令示例intarith(intx,inty,intz){intt1=x+y;intt2=z+t1;intt3=x+4;intt4=y*48;intt5=t3+t4;intrval=t2*t5;returnrval;}arith:pushl %ebpmovl %esp,%ebpmovl 8(%ebp),%ecxmovl 12(%ebp),%edxleal (%edx,%edx,2),%eaxsall $4,%eaxleal 4(%ecx,%eax),%eaxaddl %ecx,%edxaddl 16(%ebp),%edximull %edx,%eaxpopl %ebpretSetUpBodyFinish算术运算intarith(intx,inty,intz){intt1=x+y;intt2=z+t1;

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论