第四周课堂测试汇编2完善

第四周汇编2课堂测试画的图抽象且不完整,这里做一下补充。

(1)源代码:

int g(int x){
    return x+3;
 }
 int f(int x){
     int i=2;
   return g(x)+i;
 }
 int main(void){
    return f(8)+1;
 }

(2)汇编代码:

g:
        pushl   %ebp
        movl    %esp, %ebp
        movl    8(%ebp), %eax
        addl    $3, %eax
        popl    %ebp
        ret
f:
        pushl   %ebp
        movl    %esp, %ebp
        subl    $16, %esp
        movl    $2, -4(%ebp)
        pushl   8(%ebp)
        call    g
        addl    $4, %esp
        movl    %eax, %edx
        movl    -4(%ebp), %eax
        addl    %edx, %eax
        leave
        ret
main:
        pushl   %ebp
        movl    %esp, %ebp
        pushl   $8
        call    f
        addl    $4, %esp
        addl    $1, %eax
        leave
        ret

(3)调试

disassemble可以看到main函数的汇编代码,用i r(info registers)查看各寄存器的值。display /i $pc可以使每次执行下一条汇编语句时都会显示出当前执行的语句。

单步执行pushl $8,esp减4从0xbffff118变为0xbffff114。用 x $esp查看esp所指位置所存放的值,可以看到是push进去的8。

单步执行call f,esp减4从0xbffff114变为0xbffff110,ebp不变依然是0xbffff118。用 x $esp查看esp所指位置所存放的值,0x08048411应该是call f的下一句地址。

单步执行了pushl %ebp,esp减4从0xbffff110变为0xbffff10c。用 x $esp查看esp所指位置所存放的值,0xbffff118是push进去的ebp的值。

执行 movl %esp, %ebpsubl$16, %esp后,ebp为0xbffff10c,esp为0xbffff0fc。下一句movl $2, -4(%ebp)是将立即数放到ebp减4的位置,可以通过x/8x $esp查看esp向上8个字节的所有位置所放的值(当然也可以查看ebp):

可以看到0xbffff108中放的值为“2”。继续执行pushl 8(%ebp),下一句 call g,将call g的下一句地址0x080483fb压栈。

继续执行到g函数的pop %ebp,可以看到中eax的值变为11,ebp恢复到0xbffff10c。

ret将弹出当初压栈的call g下一句addl $4, %esp的地址eip指向0x080483fb。

(4)堆栈变化

时间: 2024-10-14 04:59:33

第四周课堂测试汇编2完善的相关文章

20165326 第四周课堂测试

第四周课堂测试 知识点:命令行参数(字符串改变为int型输入),递归,利用jdb进行调试 一开始写的时候利用了for循环 for(int t:tmp){ int sum=0; if(t<0) System.out.println("wrong"); else{ for(int i=1;i<=t;i++){ int a=1; for(int j=1;j<=i;j++){ a=a*j; } sum=sum+a; } if(sum<0) System.out.prin

第四周课堂测试

源代码: #include<iostream> using namespace std; int Largest(int list[],int length) { int i,max; max=list[0]; for(i=1;i<length;i++){ if(list[i]>max){ max=list[i]; } } return max; } void main() { int length,i,max; cout<<"请输入需要比较的数字个数:&qu

第四周课堂测试补做

课上作业补做 循环与递归 第二章编程题 P32 4.1 P32 4.2 第三章编程题 P49 4.1 P49 4.2 P49 4.3 P49 4.4 P49 4.5 P49 4.6 原文地址:https://www.cnblogs.com/zhuyue-study/p/8647566.html

2017-2018-1 20155336 《信息安全系统设计基础》第八周课堂测试

2017-2018-1 20155336 <信息安全系统设计基础>第八周课堂测试 1.求命令行传入整数参数的和 参考 http://www.cnblogs.com/rocedu/p/6766748.html#SECCLA 在Linux下完成"求命令行传入整数参数的和" 测试代码传入自己的8位学号 上方提交代码 附件提交运行测试截图 解答: 编写代码 #include <stdio.h> void main(int argc,char** argv) { int

课堂测试1 登录界面

1.网站系统开发需要什么技术 前台photoshop(美工必学的)+dreaweaver(css+div)+javacript,后台php .net  asp 等编程语言,要想做好网站HTML.JAVASCRIPT.CSS.数据库.服务器配置必须要学会. 在网上查了一下,要做好一个网站系统,要学习的技术有很多,简单列举一下: (1)java Java语言体系比较庞大,包括多个模块.从WEB项目应用角度讲有JSP.Servlet.JDBC.JavaBean(Application)四部分技术. (

课堂测试——数据位数、位数输出、各位数上数据求和

2016.10.18Java课堂测试 在课堂上写的时候,写到各位书身上数据输出时.因为处理不好取最高位的步骤所以不能继续进行编程. 经过后期查找之后: 引用import static java.lang.Math.*; 求x的y次方运算,Math.pow(x,y); 求整数部分,Math.floor();//这里运行之后发现是double类型所以又用了强制转换. 将Int转换为Double类型,int number1=(int) number2; 另外的问题就是: 因为数据上存在多次变化使用,所

20155321 《信息安全系统设计》课堂测试(ch06)

20155321 <信息安全系统设计>课堂测试(ch06) (单选题|1分)下面代码中,对数组x填充后,采用直接映射高速缓存,所有对x和y引用的命中率为() A .1 B .1/4 C .1/2 D. 3/4 解析:P431,填充消除了冲突不命中,因此,四分之三的引用是命中的 正确答案:D (多选题|1分)有关高速缓存的说法正确的是() A .高速缓存的容量可以用C=SEB来计算 B .高速缓存容量为2048,高速缓存结构为(32,8,8,32) C .直接映射高速缓存要:组选择.行匹配.字抽

2017-2018-1 20155232 《信息安全系统设计基础》第十周课堂测试(ch06)补交

# 2017-2018-1 20155232 <信息安全系统设计基础>第十周课堂测试(ch06)补交 上课时完成测试后在提交的时候,没有提交成功,进行补交. 1.下面代码中,对数组x填充后,采用直接映射高速缓存,所有对x和y引用的命中率为() A 1 B 1/4 C 1/2 D 3/4 正确答案: D 解析:p431----缓存命中:当程序需要第(k+1)层的数据对象d的时候,首先会在第k层找d:如果d刚好缓存在第k层,那么就叫做缓存命中:反之,不命中,在填充了之后,对于x和y数组,只有在引用

20162307 课堂测试 hash

20162307 课堂测试 hash 作业要求 利用除留余数法为下列关键字集合的存储设计hash函数,并画出分别用开放寻址法和拉链法解决冲突得到的空间存储状态(散列因子取0.75) 关键字集合:85,75,57,60,65,(你的8位学号相加值),98,74,89,12,5,46,97,13,69,52,92 实验知识点 开放寻址法 基本思想 在散列表中形成一个探查序列,沿此序列逐单元进行查找,直到找到一个空的单元时将新结点放入. 拉链法 基本思想 将所有关键字为同义词的结点链接到同一个单链表中