日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

iOS Hacker Xcode玩转arm64汇编基础

發布時間:2024/4/18 编程问答 40 豆豆
生活随笔 收集整理的這篇文章主要介紹了 iOS Hacker Xcode玩转arm64汇编基础 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

已經熟悉了x86匯編,所以其他的理論就不多記了,主要是記錄以下這些。

iphon5s以上都是arm64的設備
armv6 設備:iPhone, iPhone2, iPhone3G, 第一代、第二代 iPod Touch
armv7 設備:iPhone3GS, iPhone4, iPhone4S
? ? ? ? ? ?iPad, iPad2, iPad3(The New iPad), iPad mini
? ? ? ? ? ?iPod Touch 3G, iPod Touch4
armv7s設備:iPhone5, iPhone5C, iPad4(iPad with Retina Display)
arm64 設備:iPhone5S, iPad Air, iPad mini2(iPad mini with Retina Display)

最常用匯編指令
str 將數據從寄存器中讀取存放到內存
ldr 將內存中的數據讀取放到寄存器
bl ?跳轉

32位寄存器
R0-R3 ? //函數的前4個參數放在R0-R3中,其他的參數放到棧中,返回值在R0 ??
R7 ?
R9
R13 ? ?//SP寄存器
R14 ? ?//LR寄存器,保存函數返回地址
R15 ? ?//PC寄存器

32位的寄存器容量是8位,64位寄存器的容量16位的,數量也更多一些,x1,x2,x3...
---------------------------------------------------------------------

以下是64位的arm匯編的一個實例,理解arm匯編的函數調用的過程。
打開Xcode,新建ios工程,在main.m下寫如下代碼

#import <UIKit/UIKit.h> #import "AppDelegate.h"int funcAdd(a,b,c,d,e,f) {int g=a+b+c+d+e+f;return g; } int main(int argc, char * argv[]) {funcAdd(1, 2, 3, 4, 5, 6);@autoreleasepool {return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class]));} }
在Xcode菜單欄選擇Product=>Perform Action => Assemble main.m, 注意選擇在真機編譯才能生成arm匯編,在模擬器是x86的。
顯示代碼有很多.loc開頭的鬼東西,為了看著方便可以刪掉。

_funcAdd: ; @funcAdd Lfunc_begin0:.loc 1 13 0 ; /Users/exchen/Desktop/armasm/armasm/main.m:13:0.cfi_startproc ; BB#0:sub sp, sp, #32 ; =32 Ltmp1:.cfi_def_cfa_offset 32str w0, [sp, #28] ;將w0寄存器的值放入sp+28,第1個參數astr w1, [sp, #24] ;將w1寄存器的值放入sp+24,第2個參數bstr w2, [sp, #20] ;將w2寄存器的值放入sp+20,第3個參數cstr w3, [sp, #16] ;將w3寄存器的值放入sp+16,第4個參數dstr w4, [sp, #12] ;將w4寄存器的值放入sp+12,第5個參數estr w5, [sp, #8] ;將w5寄存器的值放入sp+8, 第6個參數f.loc 1 14 11 prologue_end ; /Users/boot/Desktop/armasm/armasm/main.m:14:11 Ltmp2:ldr w0, [sp, #28] ;將第1個參數a放入w0寄存器ldr w1, [sp, #24] ;將第2個參數b放入w1寄存器add w0, w0, w1 ;將w0和w1的值相加并存入w0寄存器ldr w1, [sp, #20] ;將第3個參數e放入w1寄存器add w0, w0, w1 ;將w0和w1的值相加并存入w0寄存器ldr w1, [sp, #16] ;將第4個參數d放入w1寄存器add w0, w0, w1 ;將w0和w1的值相加并存入w0寄存器ldr w1, [sp, #12] ;將第5個參數e放入w1寄存器add w0, w0, w1 ;將w0和w1的值相加并存入w0寄存器ldr w1, [sp, #8] ;將最后一個參數f放入w1寄存器add w0, w0, w1 ;將w0和w1的值相加并存入w0寄存器str w0, [sp, #4] ldr w0, [sp, #4]add sp, sp, #32 ; =32ret Ltmp3: Lfunc_end0:
這是在真機運行的匯編代碼和上面是一樣的。

armasm`funcAdd:0x1000389f0 <+0>: sub sp, sp, #320x1000389f4 <+4>: str w0, [sp, #28]0x1000389f8 <+8>: str w1, [sp, #24]0x1000389fc <+12>: str w2, [sp, #20]0x100038a00 <+16>: str w3, [sp, #16]0x100038a04 <+20>: str w4, [sp, #12]0x100038a08 <+24>: str w5, [sp, #8] -> 0x100038a0c <+28>: ldr w0, [sp, #28]0x100038a10 <+32>: ldr w1, [sp, #24]0x100038a14 <+36>: add w0, w0, w10x100038a18 <+40>: ldr w1, [sp, #20]0x100038a1c <+44>: add w0, w0, w10x100038a20 <+48>: ldr w1, [sp, #16]0x100038a24 <+52>: add w0, w0, w10x100038a28 <+56>: ldr w1, [sp, #12]0x100038a2c <+60>: add w0, w0, w10x100038a30 <+64>: ldr w1, [sp, #8]0x100038a34 <+68>: add w0, w0, w10x100038a38 <+72>: str w0, [sp, #4]0x100038a3c <+76>: ldr w0, [sp, #4]0x100038a40 <+80>: add sp, sp, #320x100038a44 <+84>: ret


main函數里調用funcAdd的過程

.globl _main.align 2 _main: ; @main Lfunc_begin1:.loc 1 17 0 is_stmt 1 ; /Users/exchen/Desktop/armasm/armasm/main.m:17:0.cfi_startproc ; BB#0:stp x29, x30, [sp, #-16]!mov x29, spsub sp, sp, #64 ; =64 Ltmp4:.cfi_def_cfa w29, 16 Ltmp5:.cfi_offset w30, -8 Ltmp6:.cfi_offset w29, -16orr w8, wzr, #0x1 ;和mov w8,#0x1是一樣的orr w9, wzr, #0x2 ;同上orr w2, wzr, #0x3orr w3, wzr, #0x4movz w4, #0x5orr w5, wzr, #0x6stur wzr, [x29, #-4]stur w0, [x29, #-8]stur x1, [x29, #-16] mov x0, x8mov x1, x9 ;到這我們發現,函數參數1-6依次存放到w0-w5,或者說是x1-x5,這和32位是有很大區別的。bl 0x1000d09f0 ;調用funcAdd
main函數真機運行的匯編代碼

armasm`main:0x1000d0a48 <+0>: stp x29, x30, [sp, #-16]!0x1000d0a4c <+4>: mov x29, sp0x1000d0a50 <+8>: sub sp, sp, #640x1000d0a54 <+12>: orr w8, wzr, #0x1 0x1000d0a58 <+16>: orr w9, wzr, #0x20x1000d0a5c <+20>: orr w2, wzr, #0x30x1000d0a60 <+24>: orr w3, wzr, #0x40x1000d0a64 <+28>: movz w4, #0x50x1000d0a68 <+32>: orr w5, wzr, #0x60x1000d0a6c <+36>: stur wzr, [x29, #-4]0x1000d0a70 <+40>: stur w0, [x29, #-8]0x1000d0a74 <+44>: stur x1, [x29, #-16] -> 0x1000d0a78 <+48>: mov x0, x80x1000d0a7c <+52>: mov x1, x90x1000d0a80 <+56>: bl 0x1000d09f0 ; funcAdd at main.m:13

總結

以上是生活随笔為你收集整理的iOS Hacker Xcode玩转arm64汇编基础的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。