Pebble Coding

ソフトウェアエンジニアによるIT技術、数学の備忘録

macOS環境にてバイナリをdisassembleする

~$ 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