~$ cat main.c #include <stdio.h> int main(int argc, char** argv) { int a = 2; int b = 3; int c = a + b; return 0; } ~$ cc main.c ~$ otool -tvV a.out a.out: (__TEXT,__text) section _main: 0000000100000f80 pushq %rbp 0000000100000f81 movq %rsp, %rbp 0000000100000f84 xorl %eax, %eax 0000000100000f86 movl $0x0, -0x4(%rbp) 0000000100000f8d movl %edi, -0x8(%rbp) 0000000100000f90 movq %rsi, -0x10(%rbp) 0000000100000f94 movl $0x2, -0x14(%rbp) ; 値2をローカル変数領域Aにセットする 0000000100000f9b movl $0x3, -0x18(%rbp) ; 値3をローカル変数領域Bにセットする 0000000100000fa2 movl -0x14(%rbp), %edi ; 値2が入ったローカル変数領域の値を%ediレジスタにセットする 0000000100000fa5 addl -0x18(%rbp), %edi ; %ediレジスタの値にローカル変数領域Bの値を加算する 0000000100000fa8 movl %edi, -0x1c(%rbp) 0000000100000fab popq %rbp 0000000100000fac retq
# std::vector 実装をdisassembleする
~$ cat main.cpp #include <stdio.h> #include <vector> int main(int argc, char** argv) { std::vector<int16_t> data; data.reserve(256); for (int i = 0; i < 256; ++i) { data.push_back(3); } return 0; } ~$ otool -tvV /Users/pebble8888/Library/Developer/Xcode/DerivedData/a-caxuagxwgdeqtmaqpognnfhilejt/Build/Products/Release/a /Users/pebble8888/Library/Developer/Xcode/DerivedData/a-caxuagxwgdeqtmaqpognnfhilejt/Build/Products/Release/a: (__TEXT,__text) section _main: 0000000100000eee pushq %rbp 0000000100000eef movq %rsp, %rbp 0000000100000ef2 pushq %rbx 0000000100000ef3 pushq %rax 0000000100000ef4 movl $0x2000, %edi 0000000100000ef9 callq 0x100000f54 ## symbol stub for: _malloc 0000000100000efe movq %rax, %rbx 0000000100000f01 movdqa 0x87(%rip), %xmm0 0000000100000f09 xorl %eax, %eax 0000000100000f0b movdqa 0x8d(%rip), %xmm1 0000000100000f13 movdqu %xmm0, (%rbx,%rax,2) ; ループ開始位置1 0000000100000f18 addq $0x8, %rax ; 0000000100000f1c paddw %xmm1, %xmm0 0000000100000f20 cmpq $0x1000, %rax 0000000100000f26 jne 0x100000f13 ; ループ開始位置へジャンプする 0000000100000f28 movswl 0x1000(%rbx), %esi 0000000100000f2f leaq 0x7a(%rip), %rdi ## literal pool for: "data %d" 0000000100000f36 xorl %eax, %eax 0000000100000f38 callq 0x100000f5a ## symbol stub for: _printf 0000000100000f3d movq %rbx, %rdi 0000000100000f40 callq 0x100000f4e ## symbol stub for: _free 0000000100000f45 xorl %eax, %eax 0000000100000f47 addq $0x8, %rsp 0000000100000f4b popq %rbx 0000000100000f4c popq %rbp 0000000100000f4d retq
movdqa : アライメントが揃っている128Bit転送
movdqu : アライメントが揃っていない128Bit転送
paddw : packed add word