20242811《Linux内核原理与分析》第二周作业

首先使用touch命令在当前目录下创建一个main.c文件,然后使用gedit命令打开main.c文件进行编辑并保存。

使用 gcc –S –o main.s main.c -m32命令将main.c文件编译成汇编代码

“gcc –S –o main.s main.c -m32”命令具体的作用如下:

  • gcc:调用GCC编译器。
  • -S:告诉GCC在编译过程中生成汇编语言代码,而不是编译成机器代码。
  • -o main.s:指定输出的汇编语言文件名为main.s。如果不指定这个选项,GCC会默认使用与源文件相同的名字,但扩展名为.s
  • main.c:指定要编译的源代码文件。
  • -m32:这个选项告诉GCC生成32位代码,即使是在64位系统上运行。这在某些情况下很有用,比如当你需要生成能在32位系统上运行的程序,或者需要与32位库链接时。

这条命令的整体作用是:将main.c文件编译成32位的汇编语言代码,并将生成的汇编代码保存到main.s文件中。这个过程中不涉及链接步骤,因此不会生成可执行文件,只有汇编代码文件会被创建。

最终的结果如图所示

对汇编语言代码的分析

  • 函数g:
    pushl %ebp ; 保存旧的基指针
    movl %esp, %ebp ; 设置新的基指针
    call __x86.get_pc_thunk.ax ; 调用一个thunk函数,用于获取程序计数器(PC)的值
    addl $GLOBAL_OFFSET_TABLE, %eax ; 将全局偏移表(GOT)的地址加到EAX寄存器
    movl 8(%ebp), %eax ; 将函数参数(位于基指针+8的位置)移到EAX寄存器
    addl $10, %eax ; 将立即数10加到EAX寄存器
    popl %ebp ; 恢复旧的基指针
    ret ; 返回到调用者
  • 函数f:
    pushl %ebp ; 保存旧的基指针
    movl %esp, %ebp ; 设置新的基指针
    call __x86.get_pc_thunk.ax ; 调用thunk函数获取PC的值
    addl $GLOBAL_OFFSET_TABLE, %eax ; 将GOT的地址加到EAX寄存器
    pushl 8(%ebp) ; 将函数参数压入栈
    call g ; 调用函数g
    addl $4, %esp ; 清理栈(移除参数)
    leave ; 等同于 movl %ebp, %esp; popl %ebp,恢复栈帧
    ret ; 返回到调用者
  • 函数main:
    pushl %ebp ; 保存旧的基指针
    movl %esp, %ebp ; 设置新的基指针
    call __x86.get_pc_thunk.ax ; 调用thunk函数获取PC的值
    addl $GLOBAL_OFFSET_TABLE, %eax ; 将GOT的地址加到EAX寄存器
    pushl $20 ; 将立即数20压入栈作为参数传递给函数f
    call f ; 调用函数f
    addl $4, %esp ; 清理栈(移除参数)
    addl $1, %eax ; 将EAX寄存器的值加1
    leave ; 恢复栈帧
    ret ; 返回到调用者

X86汇编mov指令及几种内存寻址方式

  • 寄存器寻址:ovl %eax,%edx edx = eax
  • 立即寻址:movl $0x123,%edx edx = Ox123 $符表示一个立即数
  • 直接寻址:movl Ox123, %edx edx = (int32_t)Ox123
  • 间接寻址:movl (%ebx),%edx edx =*(int32_t*)ebx
  • 变址寻址:movl 4(%ebx),%edx edx = *(int32_t*)(ebx+4)

AT&T汇编格式与lntel汇编格式略有不同,Linux内核使用的是AT&T汇编格式,几个重要的汇编指令:push、pop、call、ret。eip寄存器不能被直接修改,只能通过特殊指令间接修改。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值