iOS匯編學習一

寫個最簡單的helloword.c方法,使用clang命令編譯

#include <stdio.h>

int main() {
  printf("hellow word\n");
  return 0;
}

使用clang -S -arch arm64 -isysrootxcrun --sdk iphoneos --show-sdk-pathhelloword.c, 其中xcrun --sdk iphoneos --show-sdk-path輸出響應(yīng)版本sdk的目錄

    .section    __TEXT,__text,regular,pure_instructions
    .build_version ios, 13, 4   sdk_version 13, 4
    .globl  _main                   ; -- Begin function main
    .p2align    2
_main:                                  ; @main
    .cfi_startproc
; %bb.0:
    sub sp, sp, #32             ; =32
    stp x29, x30, [sp, #16]     ; 16-byte Folded Spill
    add x29, sp, #16            ; =16
    .cfi_def_cfa w29, 16
    .cfi_offset w30, -8
    .cfi_offset w29, -16
    stur    wzr, [x29, #-4]
    adrp    x0, l_.str@PAGE
    add x0, x0, l_.str@PAGEOFF
    bl  _printf
    mov w8, #0
    str w0, [sp, #8]            ; 4-byte Folded Spill
    mov x0, x8
    ldp x29, x30, [sp, #16]     ; 16-byte Folded Reload
    add sp, sp, #32             ; =32
    ret
    .cfi_endproc
                                        ; -- End function
    .section    __TEXT,__cstring,cstring_literals
l_.str:                                 ; @.str
    .asciz  "hellow word\n"


.subsections_via_symbols

代碼中類似.section或.globl等以'.'開頭的, 被稱之為編譯器指令
類似_main:l_.str:被稱之為標簽(label), 用于輔助定位代碼或者資源地址
類似pushq或movq的, 被稱之為匯編指令, 它們會被匯編器編譯為機器代碼, 最終被cpu所執(zhí)行

基本匯編知識

寄存器

寄存器是CPU中的高速存儲單元,要比內(nèi)存中存取要快的多。

r0~r30

r0 - r30 是31個通用整形寄存器。每個寄存器可以存取一個64位大小的數(shù)。 當使用 x0 - x30訪問時,它就是一個64位的數(shù)。當使用w0 - w30訪問時,訪問的是這些寄存器的低32位

1.png

其中r29 又被叫做 fp (frame pointer). r30 又被叫做 lr (link register)

SP

SP寄存器其實就是 x31,在指令編碼中,使用 SP/WSP來進行對SP寄存器的訪問

V0 – V31

V0 - V31是向量寄存器,也可以說是浮點型寄存器。它的特點是每個寄存器的大小是 128 位的。 分別可以用Bn Hn Sn Dn Qn的方式來訪問不同的位數(shù)。如圖

2.png

SPRs

SPRs是狀態(tài)寄存器,用于存放程序運行中一些狀態(tài)標識。不同于編程語言里面的if else.在匯編中就需要根據(jù)狀態(tài)寄存器中的一些狀態(tài)來控制分支的執(zhí)行。狀態(tài)寄存器又分為 The Current Program Status Register (CPSR)The Saved Program Status Registers (SPSRs)。 一般都是使用CPSR, 當發(fā)生異常時, CPSR會存入SPSR。當異?;謴?fù),再拷貝回CPSR。
還有一些系統(tǒng)寄存器,還有 FPSR FPCR是浮點型運算時的狀態(tài)寄存器等?;玖私馍厦孢@些寄存器就可以了

棧就是指令執(zhí)行時存放臨時變量的內(nèi)存空間。在學習匯編代碼的執(zhí)行過程中,了解棧的結(jié)構(gòu)非常重要。
先列出一些棧的特性:

  • 棧是從高地址到低地址的, 棧低是高地址,棧頂是低地址。
  • fp指向當前frame的棧底,也就是高地址。
  • sp指向棧頂,也就是地地址。
    下面的圖簡單的描述了從方法A調(diào)用方法B時 棧是如何劃分的:


    3.jpeg
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

友情鏈接更多精彩內(nèi)容