第三章程序的转换与机器级表示分析.ppt

第三章程序的转换与机器级表示分析

X86-64架构(自学) x86-64的基本指令和对齐 数据传送指令(汇编指令中助记符“q”表示操作数长度为四字(即64位)) movabsq指令用于将一个64位立即数送到一个64位通用寄存器中; movq指令用于传送一个64位的四字; movsbq、movswq、movslq用于将源操作数进行符号扩展并传送到一个64位寄存器或存储单元中; movzbq、movzwq用于将源操作数进行零扩展后传送到一个64位寄存器或存储单元中; pushq和popq分别是四字压栈和四字出栈指令; movl指令的功能相当于movzlq指令 。 X86-64架构(自学) 数据传送指令举例 dest_type convert(source_type x) { dest_type y = (dest_type) x; return y; } 以下函数功能是将类型为source_type的参数转换为dest_type型数据并返回 根据参数传递约定知,x在RDI对应的适合宽度的寄存器(RDI、EDI、DI和DIL)中,y存放在RAX对应的寄存器(RAX、EAX、AX或AL)中,填写下表中的汇编指令以实现convert函数中的赋值语句 问题:每种情况对应的汇编指令各是什么? X86-64架构(自学) 数据传送指令举例 dest_type convert(source_type x) { dest_type y = (dest_type) x; return y; } 以下函数功能是将类型为source_type的参数转换为dest_type型数据并返回 根据参数传递约定知,x在RDI对应的适合宽度的寄存器(RDI、EDI、DI和DIL)中,y存放在RAX对应的寄存器(RAX、EAX、AX或AL)中,填写下表中的汇编指令以实现convert函数中的赋值语句 只需x的低32位 X86-64架构(自学) 算术逻辑运算指令 addq(四字相加) subq(四字相减) imulq(带符号整数四字相乘) orq(64位相或) leaq(有效地址加载到64位寄存器) 以下是C赋值语句“x=a*b+c*d;”对应的x86-64汇编代码,已知x、a、b、c和d分别在寄存器RAX(x)、RDI(a)、RSI(b)、RDX(c)和RCX(d)对应宽度的寄存器中。根据以下汇编代码,推测x、a、b、c和d的数据类型 movslq %ecx, %rcx imulq %rdx, %rcx movsbl %sil, %esi imull %edi, %esi movslq %esi, %rsi leaq (%rcx, %rsi), %rax d从32位符号扩展为64位,故d为int型 在RDX中的c为64位long型 在SIL中的b为char型 在EDI中的a是int型 在RAX中的x是long型 X86-64架构(自学) 过程调用的参数传递 通过寄存器传送参数 最多可有6个整型或指针型参数通过寄存器传递 超过6个入口参数时,后面的通过栈来传递 在栈中传递的参数若是基本类型,则都被分配8个字节 call(或callq)将64位返址保存在栈中之前,执行R[rsp]←R[rsp]-8 ret从栈中取出64位返回地址后,执行R[rsp]←R[rsp]+8 X86-64架构过程调用举例(自学) long caller ( ) { char a=1; short b=2; int c=3; long d=4; test(a, a, b, b, c, c, d, d); return a*b+c*d; } void test(char a, char *ap, short b, short *bp, int c, int *cp, long d, long *dp) { *ap+=a; *bp+=b; *cp+=c; *dp+=d; } 其他6个参数在哪里? 执行到caller的call指令前,栈中的状态如何? X86-64架构过程调用举例(自学) long caller ( ) { char a=1; short b=2; int c=3; long d=4; test(a, a, b, b, c, c, d, d); return a*b+c*d; } 第15条指令 X86-64架构过程调用举例(自学) 执行到test的ret指令前,栈中的状态如何?ret执行后怎样? void test(char a, char

文档评论(0)

1亿VIP精品文档

相关文档