C变量分配空间
// var.c // int=4bytes=32bits // ? *=8bytes=64bits // 该段空间里面会占用24bytes // 空间变量定义顺序分配 #include <stdio.h> int main(){ int add = 0x12345678; int a = 1; int *p = 0x123456789; int b = 2; long c = 3; return 0; }
汇编代码
gcc -S var.c -o var.s && cat var.s
#... main: .LFB0: .cfi_startproc pushq %rbp .cfi_def_cfa_offset 16 .cfi_offset 6, -16 movq %rsp, %rbp .cfi_def_cfa_register 6 movl $305419896, -4(%rbp) #int add = 0x12345678; movl $1, -8(%rbp) #int a = 1; movabsq $4886718345, %rax #int *p = 0x123456789; movq %rax, -16(%rbp) #int *p = 0x123456789; movl $2, -20(%rbp) #int b = 2; movq $3, -32(%rbp) #long c = 3; movl $0, %eax popq %rbp #...
gdb调试
-
生成可调试文件,并进入调试
gcc -g var.c -o var && gdb var
-
设置断点
(gdb) b main
-
运行
r
-
显示当前正要执行的汇编指令
(gdb) display /i $pc
-
单步步过
(gdb) ni
-
查看rbp寄存器的值
(gdb) i r rbp rbp 0x7fffffffe360 0x7fffffffe360
-
查看以rbp地址结尾的24个字
# Directions # 内存是以1byte=8bits为单位的 # rbp中存放的是分配空间的尾地址,$rbp-4定位到rbp内容-4bytes # 首先分配给int型变量add 4bytes=32bits的空间 # (gdb) x/48cb &output # x/1xw $rbp-4==从$rbp-4开始以x方式查看1个w (gdb) x/1xw $rbp-4 0x7fffffffe35c: 0x12345678 (gdb) x/6xw $rbp-24 0x7fffffffe288: 0x00400400 0x00000000 0x23456789 0x00000001 0x7fffffffe298: 0x00000001 0x12345678
-
查看linux系统调用号
cat /usr/include/asm/unistd_32.h