[M1 Mac, Big Sur 11.6.8, clang 13.0.0, NO IDE]
cppファイルから作成したsファイルについて素人目線で無駄と思える行を削除、メモリ番地を勝手に節約してみました。
下記コードでも一応動きました。スタックポインタを32番地マイナスの位置に移動するところを16番地に、フレームポインタ他をスタックポインタ+16番地に格納するところを+8番地に変更しています。
副作用は不明です。
.section __TEXT,__text,regular,pure_instructions
.build_version macos, 11, 0 sdk_version 12, 1
.globl _main ; -- Begin function main
.p2align 2
_main: ; @main
.cfi_startproc
; %bb.0:
sub sp, sp, #16 ; スタックポインタ(sp)から16番地減算してspに格納
stp x29, x30, [sp, #8] ; fp(x29)とlr(x30)をsp+8番地に格納
.cfi_def_cfa_offset 32
.cfi_offset w30, -8
.cfi_offset w29, -16
;mov w8, #0 ; 0をw8へコピー(削除)
;str w8, [sp, #8] ; 0をsp+8番地に格納(削除)
;str wzr, [sp, #12] ; 0をsp+12番地に格納(削除)
adrp x0, l_.str@PAGE ; x0にl_.str@PAGEを書き込み
add x0, x0, l_.str@PAGEOFF ; x0にl_.str@PAGEOFFを追記
bl _printf ; printfを呼び出し
mov w0, #0 ; 0をw0へコピー(初期化)
ldp x29, x30, [sp, #8] ; sp+8の値をfp,lrに読み込む(元に戻す)
add sp, sp, #16 ; スタックポインタ(sp)から16番地加算してspに格納
ret
.cfi_endproc
; -- End function
.section __TEXT,__cstring,cstring_literals
l_.str: ; @.str
.asciz "\343\203\206\343\202\271\343\203\210"
.subsections_via_symbols
; SP他の番地移動単位は8の倍数にしないとエラーになる
;asm/test.s:9:21: error: index must be a multiple of 8 in range [-512, 504].
; stp x29, x30, [sp, #2] ; fp(x29)とlr(x30)をsp+2番地に格納
;asm/test.s:20:21: error: index must be a multiple of 8 in range [-512, 504].
; ldp x29, x30, [sp, #2] ; sp+16の値をfp,lrに読み込む(元に戻す)
;make: *** [obj/test.o] Error 1
#include <stdio.h>
int main() {
printf("テスト");
return 0;
}