汇编基础(六)内存分配区

引言

在汇编当中不光光需要了解一些寄存器,汇编代码,也需要了解一下内存是怎么分区域的

列表:

  • 代码区 特点:可读、可写、可执行
  • 栈区域 放参数和局部变量
  • 堆区域 动态申请、可读可写
  • 全局 可读可写
  • 常量 可读
    以上都是在编译器中完成的,编译器规定的。
    在汇编当中这些都是可读、可写的,因为汇编直接修改的是地址中的值

分析代码

int g = 20;
int func(int a,int b){
    printf("wode");
    int c = a + g;
    return c;
}

int main(int argc, char * argv[]) {
    printf("%d",func(1, 2));
    return 0;  
}

转换汇编
main函数

    0x104fe28c4 <+0>:  sub    sp, sp, #0x30             ; =0x30 
    0x104fe28c8 <+4>:  stp    x29, x30, [sp, #0x20]
    0x104fe28cc <+8>:  add    x29, sp, #0x20            ; =0x20 
    0x104fe28d0 <+12>: orr    w8, wzr, #0x1
    0x104fe28d4 <+16>: orr    w9, wzr, #0x2
    0x104fe28d8 <+20>: stur   wzr, [x29, #-0x4]
    0x104fe28dc <+24>: stur   w0, [x29, #-0x8]
    0x104fe28e0 <+28>: str    x1, [sp, #0x10]
->  0x104fe28e4 <+32>: mov    x0, x8
    0x104fe28e8 <+36>: mov    x1, x9
    0x104fe28ec <+40>: bl     0x104fe2874               ; func at main.m:14
    0x104fe28f0 <+44>: mov    x30, x0
    0x104fe28f4 <+48>: mov    x10, sp
    0x104fe28f8 <+52>: str    x30, [x10]
    0x104fe28fc <+56>: adrp   x0, 1
    0x104fe2900 <+60>: add    x0, x0, #0xf2d            ; =0xf2d 
    0x104fe2904 <+64>: bl     0x104fe2bf8               ; symbol stub for: printf
    0x104fe2908 <+68>: mov    w8, #0x0
    0x104fe290c <+72>: str    w0, [sp, #0xc]
    0x104fe2910 <+76>: mov    x0, x8
    0x104fe2914 <+80>: ldp    x29, x30, [sp, #0x20]
    0x104fe2918 <+84>: add    sp, sp, #0x30             ; =0x30 
    0x104fe291c <+88>: ret    

func函数

    0x1008ce874 <+0>:  sub    sp, sp, #0x20             ; =0x20 
    0x1008ce878 <+4>:  stp    x29, x30, [sp, #0x10]
    0x1008ce87c <+8>:  add    x29, sp, #0x10            ; =0x10 
    0x1008ce880 <+12>: stur   w0, [x29, #-0x4]
    0x1008ce884 <+16>: str    w1, [sp, #0x8]
->  0x1008ce888 <+20>: adrp   x0, 1
    0x1008ce88c <+24>: add    x0, x0, #0xf28            ; =0xf28 
    0x1008ce890 <+28>: bl     0x1008cebf8               ; symbol stub for: printf
    0x1008ce894 <+32>: adrp   x30, 2
    0x1008ce898 <+36>: add    x30, x30, #0xd10          ; =0xd10 
    0x1008ce89c <+40>: ldur   w1, [x29, #-0x4]
    0x1008ce8a0 <+44>: ldr    w8, [x30]
    0x1008ce8a4 <+48>: add    w8, w1, w8
    0x1008ce8a8 <+52>: str    w8, [sp, #0x4]
    0x1008ce8ac <+56>: ldr    w8, [sp, #0x4]
    0x1008ce8b0 <+60>: str    w0, [sp]
    0x1008ce8b4 <+64>: mov    x0, x8
    0x1008ce8b8 <+68>: ldp    x29, x30, [sp, #0x10]
    0x1008ce8bc <+72>: add    sp, sp, #0x20             ; =0x20 
    0x1008ce8c0 <+76>: ret    

汇编分析
在main函数汇编中:(只写大概的意思就不一一分析了)

  • 前三句,分配栈空间,保存栈底 跟 回家的路地址ret后的地址
  • 赋值给w8 w9常量也就是func(1, 2)中的1和2
  • stur wzr, [x29, #-0x4] wzr 的值存入 x29 - 0x4
  • stur w0, [x29, #-0x8] w0的值存入到x29 - 0x8
  • str x1, [sp, #0x10] x1的值存入到sp + 0x10
  • mov x0, x8 x0 = x8 x0是参数 func中的参数
  • mov x1, x9 x1 = x9 x1是参数 func中的参数
    后面的不做分析

在func函数汇编中

  • 拉伸栈空间
  • 保护:x29、x30入栈
  • 将 x29 = sp + 0x10 sp地址向上移动16个字节
  • 将w0 存入到 x29 - 0x4的地址中
  • 将w1 存入到sp + 0x8的地址中
  • adrp x0,1
    1. 1左移动12位 0001 0000 0000 0000
      0x1000
    2. 将pc寄存器的低12位清0
      0x102fbe000
    3. 将pc低12位清0后的值 = 0x1000 赋值给x0寄存器
      0x102fbe000
      总结
      adrp找到的是一个目标数据偏移的相对地址,他是一个不准确的地址,偏移的误差有4KB
      为什么偏移的误差是4KB呐? 在地址总线上面,10条地址总线的寻址能力是1024,12条地址总线的能力是4*1024 4KB
  • add x0, x0, #0xf28 x0 =0x102fbff28 这个应该是printf中打印的常量参数


  • printf打印上面的常量参数
  • adrp x30, 2
    1. 2左移动12位 0002 0000 0000 0000
      0x2000
    2. 将pc寄存器的低12位清0
      0x10013a000
    3. 将pc低12位清0后的值 = 0x2000 赋值给x0寄存器
      0x10013c000
  • add x30, x30, #0xd10 x30 = 0x10013cd10 x30的值是一个地址,int*类型, 因为是地址所以需要去值 *(int *)


  • ldur w1, [x29, #-0x4] x29 - 0x4 = w1 值
  • ldr w8, [x30] w8 = x30 值
  • add w8, w1, w8 w8 = w1 + w8 w1 是参数a w8是全局变量 20
  • str w8, [sp, #0x4] w8的值存入 sp+0x4这个地址当中
  • ldr w8, [sp, #0x4] 从地址 sp+0x4读取数据赋值给w8 这两句废话
  • str w0, [sp] 将w0的值存入sp地址中
  • mov x0, x8 x0 = x8
  • ldp x29, x30, [sp, #0x10] 从sp+0x10开始分别读取存入x29、x30 回家的路
  • add sp, sp, #0x20 收回栈空间 也就是栈平衡
  • ret 回家

总结

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,686评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,668评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 158,160评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,736评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,847评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,043评论 1 291
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,129评论 3 410
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,872评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,318评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,645评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,777评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,470评论 4 333
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,126评论 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,861评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,095评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,589评论 2 362
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,687评论 2 351

推荐阅读更多精彩内容