Aarch64 のアセンブラ
Menuもとのソース
extern int printf(const char *,...);
#define TYPE int
TYPE f(TYPE a, TYPE b) {
return a + b;
}
int main()
{
TYPE a = 1;
TYPE b = 2;
printf("%x = %x + %x \n",f(a,b),a,b);
return 0;
}
これを
clang -O0 -S aho.cでコンパイルすると aho.s ができる。
関数 f の変更
以下の _f を変更する
_f: ; @f
.cfi_startproc
; %bb.0:
mul w9, w1, w9
ret
.cfi_endproc
; -- End function
.globl _main ; -- Begin function main
.p2align 2
_main: ; @main
実行
% clang aho-arm.s
% :44 lldb a.out
(lldb) stepi
Process 71648 stopped
* thread #1, queue = 'com.apple.main-thread', stop reason = instruction step into
frame #0: 0x0000000100003f3c a.out`f + 4
a.out`f:
-> 0x100003f3c <+4>: ret
a.out`main:
0x100003f40 <+0>: sub sp, sp, #0x30
0x100003f44 <+4>: stp x29, x30, [sp, #0x20]
0x100003f48 <+8>: add x29, sp, #0x20
Target 0: (a.out) stopped.
(lldb) register read
General Purpose Registers:
x0 = 0x0000000000000001
x1 = 0x0000000000000002
x2 = 0x000000016fdff0a8
x3 = 0x000000016fdff298
x4 = 0x000000019a850ac8 dyld`lsl::EphemeralAllocator::allocate_buffer(unsigned long long, unsigned long long, unsigned long long)
x5 = 0x00000002073efad8 dyld`vtable for lsl::EphemeralAllocator + 72
x6 = 0x0000000000000000
x7 = 0x0000000000000db0
x8 = 0x0000000000000001
x9 = 0x0000000000000006
x10 = 0x0000000000000002
x11 = 0x00000000000002c0
x12 = 0x0000000000008000
x13 = 0x1000000000000000
x14 = 0x0000000000000004
x15 = 0x0000000000008000
x16 = 0x000000016fdfee60
x17 = 0x000000016fdfee60
x18 = 0x0000000000000000
x19 = 0x0000000100411b90
x20 = 0x0000000100003f40 a.out`main
x21 = 0x000000016fdfee60
x22 = 0x0000000100411910
x23 = 0x000000016fdfeee0
x24 = 0x000000016fdfef20
x25 = 0x000000019a89e2db "/usr/lib/dyld"
x26 = 0x0000000000000000
x27 = 0x0000000000000000
x28 = 0x0000000000000000
fp = 0x000000016fdfee40
lr = 0x0000000100003f60 a.out`main + 32
sp = 0x000000016fdfee20
pc = 0x0000000100003f3c a.out`f + 4
cpsr = 0x80001000
(lldb) dissa _f
error: 'dissa' is not a valid command.
(lldb) dis _f
error: 'disassemble' doesn't take any arguments.
(lldb) dis
a.out`f:
0x100003f38 <+0>: mul w9, w1, w9
-> 0x100003f3c <+4>: ret
(lldb) p $pc
(unsigned long) 4294983484
(lldb) p (void*) $pc
(void *) 0x0000000100003f3c
(lldb)