实验11_程序的机器级表示_过程_实验报告
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 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
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。