实验11_程序的机器级表示_过程_实验报告

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

浙江大学城市学院实验报告

课程名称计算机系统原理实验

实验项目名称实验十一程序的机器级表示——过程

学生姓名专业班级学号

实验成绩指导老师(签名)日期

注意:

●务请保存好各自的源代码,已备后用。

●请把作业同时上传到BB平台和FTP。

●文件名为:学号_姓名_日期_实验几,如30801001_姓名_20100305_实验01

●ftp://10.66.28.222:2007huommupload 123456

一、实验目的:

了解IA32指令系统的常用指令,了解Linux汇编语言的基本语法、汇编语言的编写、调试技巧。

二、实验内容:

1、阅读给出test11_1.c以及对应的反汇编代码,为汇编代码添加注释,并画出函数调用前后的栈帧结构图。

2、阅读给出test11_2.c以及对应的汇编代码,为汇编代码添加注释,并补充完整c程序源码。

三、实验步骤:

1、阅读给出test11_1.c以及对应的反汇编代码,为汇编代码添加注释,并画出函数调用前后的栈帧结构图。

指令注释:

08048354 :

8048354: 55 push %ebp #

8048355: 89 e5 mov %esp,%ebp #

8048357: 53 push %ebx #

8048358: 8b 55 08 mov 0x8(%ebp),%edx #

804835b: 8b 4d 0c mov 0xc(%ebp),%ecx # 804835e: 8b 1a mov (%edx),%ebx # 8048360: 8b 01 mov (%ecx),%eax # 8048362: 89 02 mov %eax,(%edx) # 8048364: 89 19 mov %ebx,(%ecx) # 8048366: 01 d8 add %ebx,%eax # 8048368: 5b pop %ebx #

8048369: 5d pop %ebp #

804836a: c3 r et

0804836b :

804836b: 55 push %ebp #

804836c: 89 e5 mov %esp,%ebp #

804836e: 83 ec 18 sub $0x18,%esp # 8048371: c7 45 fc 7b 00 00 00 movl $0x7b,0xfffffffc(%ebp) # 8048378: c7 45 f8 c8 01 00 00 movl $0x1c8,0xfffffff8(%ebp) # 804837f: 8d 45 f8 lea 0xfffffff8(%ebp),%eax # 8048382: 89 44 24 04 mov %eax,0x4(%esp) # 8048386: 8d 45 fc lea 0xfffffffc(%ebp),%eax # 8048389: 89 04 24 mov %eax,(%esp) #

804838c: e8 c3 ff ff ff call 8048354 # 8048391: 8b 55 fc mov 0xfffffffc(%ebp),%edx # 8048394: 2b 55 f8 sub 0xfffffff8(%ebp),%edx # 8048397: 0f af c2 imul %edx,%eax #

804839a: c9 l eave #

804839b: c3 r et #

调试过程及结果解释(截图):

函数栈帧结构图:

调用swap_add之前:

caller栈帧

调用swap_add 过程当中:

2、(选做)

1)为汇编代码每行添加注释;fun

存储在被调用者保存寄存器%ebx 中的值是什

么?

fun:

pushl %ebp #

movl %esp, %ebp #

pushl %ebx #

subl $4, %esp #

movl 8(%ebp), %ebx #

movl $0, %eax # testl %ebx, %ebx #test 指令的作用:两个操作数按位与,根据与的结果设 置相应的标志位,但是相与的结果并不保留。

je .L4 #

movl %ebx, %eax #

shrl %eax #

movl %eax, (%esp) #

call fun # movl %ebx, %edx #

swap_add 栈帧 caller 栈帧 caller 栈帧

andl $1, %edx #

leal (%edx,%eax), %eax #

.L4:

addl $4, %esp #

popl %ebx #

popl %ebp #

ret #

2)填写上述c代码中缺失的表达式;

3)描述fun函数的功能;

求(x+1)/2

4)调试验证理解:

四、思考题(必做)

1)函数调用时,实参存储在哪个函数的栈帧中?

函数调用时的内存分析

(为即将调用的函数准备参数)

mov %ebp+偏移,%eax 将参数传到eax

mov %eax ,%esp+偏移将参数放到当前空间。

sub $18 ,%ebp #将栈底指针向下移动以存放参数和变量。

(call 保存函数执行现场)

call %eip

相当于指令:push %eip

mov addr ,%eip

(保存栈的相关指针)

push %ebp #保存栈顶。

mov %esp, %ebp #将栈底赋给栈顶。

(将返回值放入eax中,供调用函数读取)

mov 返回变量地址, %eax

(还原栈指针,释放被调用函数的内存空间。)

leave

相当于一下指令:mov %ebp, %dsp

pop %ebp

(恢复调用前的现场)

ret

相当于一下指令:~call

pop %eip //恢复执行前的地址。

问题:

每次为参数和变量预留空间时sub的值是怎么确定的?

sub 的值是由被调用函数内部声明的变量和参数决定的。每多一个参数地址就加0x04,而函数中的变量为每四个,地址就增加0x10。例如:有两个整形参数,则加0x08,有一个整形参数的话加0x10,有四个整形参数也加0x10,有五个时就加0x20。

相关文档
最新文档