15213-BombLab 备忘

来源:互联网 发布:馆陶县行知教育集团 编辑:程序博客网 时间:2024/05/18 14:11

C

#include <stdio.h>int main(int argc, char** argv) {    int ret = printf("%s\n", argv[argc-1]);    return ret; // number of characters printed }
  • argc 是命令行的参数个数
  • argv[]argc 个参数,其中第0个参数是程序名main,以后的参数命令行后面跟的用户输入的参数
    • argv[] 数组中至少有一个指针指向main( ) 函数,即argv[0].

GDB

参考指令集:Summary of GDB commands for x86-64 Systems

x86-64寄存器内部关系

现代x86_64处理器具有64位寄存器,可以以backward-compatible方式用作32位寄存器,16位寄存器甚至8位寄存器。

寄存器 rax/eax/ax/al 内部结构关系:

|63..32|31..16|15-8|7-0|              |AH. |AL.|              |AX......|       |EAX............||RAX...................|0x1122334455667788  ================ rax (64 bits)          ======== eax (32 bits)              ====  ax (16 bits)              ==    ah (8 bits)                ==  al (8 bits)

Assembly

Quick Info for Assembly

Registers 根据 Calling Convention 可被分为两种:caller-save register 和 callee-save register.

callee-save register 由 callee 负责 push 进 或者 pop 出 stack

callee 要用 callee-save register 前, 需要先将其值 push 至 stack,用完后再 pop 出 stack,恢复 callee-save register 原始值。因此,对 caller 而言,该 register 值在调用前后保持一致。

参考链接:

  1. int main(int argc,char* argv[])详解
  2. Calling Convention
  3. 15-213 Recitation: Bomb Lab
  4. x86_64注册rax/eax/ax/al覆盖完整的寄存器内容
原创粉丝点击