2021-2022-1 20212810《Linux内核原理与分析》第二周作业

主要问题:

         一开始用mac编译的内容如下,发现很多指令和资料上存在不同。

 比如bx lr都无法在传统指令上查到具体作用,后查阅资料发现,这是arm特殊的指令集。发现生成的汇编语言代码和具体的硬件有关,于是在云服务器上进行编译,终于得到和课程中相近的代码。

实验一:反汇编一个简单的C程序

实验步骤

创建main.c,并编辑main.c文件,全部创建过程如图:用 gcc 将main.c编译成汇编代码,代码如下:

由于main.s,源码繁琐,所以删除以点开头的,剩下则是纯汇编代码,如下就是程序执行的具体过程:

```


g:
    pushl    %ebp                    ;ebp入栈,保存g的栈底
    movl    %esp, %ebp              ;edp=esp,生成新的堆栈
    movl    8(%ebp), %eax           ;将变址寻址ebp+8所指向内存的值存入eax
    addl    $3, %eax                ;将eax的值加3
    popl    %ebp                    ;撤销函数堆栈
    ret                             ;返回
f:
    pushl    %ebp                     ;ebp入栈,保存f的栈底
    movl    %esp, %ebp               ;edp=esp,生成新的堆栈
    pushl    8(%ebp)                  ;将变址寻址ebp+8所指向内存的值入栈
    call    g                        ;先将call指令的f指令的CS和IP入栈,就是操作与call对应的jmp指令
    addl    $4, %esp                 ;esp减4,增加一个存储空间
    leave                            ;撤销函数堆栈
    ret                              ;返回
main:

    pushl    %ebp                       ;ebp入栈,保存main的栈底
    movl    %esp, %ebp                 ;edp=esp,生成新的堆栈
    pushl    $2810                      ;将常数2810入栈
    call    f                          ;先将call指令的f指令的CS和IP入栈,就是操作与call对应的jmp指令
    addl    $4, %esp                   ;esp减4,增加一个存储空间
    addl    $1, %eax                   ;将eax的值加1
    leave                              ;撤销函数堆栈
    ret                                ;返回

```

猜你喜欢

转载自blog.csdn.net/weixin_62167029/article/details/120597811