@ledsun blog

無味の味は佳境に入らざればすなわち知れず

もっとCPUの気持ちが知りたいですか?

peaks.cc

読んでみます。

「第2章 CPUと友達になろう」にC言語のプログラムをアセンブラにする方法が載っていました。 自分の環境でも試してみます。 WSL上のgccで試しました。

#include <stdio.h>

int main(int argc, char** argv)
{
        int a = 1;
        int b = 2;
        int c = a + b;
        printf("c = %d\n", c);
        return 0;
}

これをgcc calc1.cするとa.outファイルが出来ます。 objdumpコマンドを使う方法が載っていました。

ledsun@MSI:~/more_cpu_mind►objdump -d a.out

a.out:     file format elf64-x86-64


Disassembly of section .init:

0000000000001000 <_init>:

おお、書籍ではmach-o-arm64と表示されるところが、elf64-x86-64と表示されます。 CPU依存っぽさがでてます。

Cコンパイラ-Sオプションを使う方法も紹介されています。 gccでもオプションは共通です。 gcc -S calc1.cを実行するとcalc.sファイルができます。

        .file   "calc1.c"
        .text
        .section        .rodata
.LC0:
        .string "c = %d\n"
        .text
        .globl  main
        .type   main, @function
main:
.LFB0:
        .cfi_startproc
        endbr64
        pushq   %rbp
        .cfi_def_cfa_offset 16
        .cfi_offset 6, -16
        movq    %rsp, %rbp
        .cfi_def_cfa_register 6
        subq    $32, %rsp
        movl    %edi, -20(%rbp)
        movq    %rsi, -32(%rbp)
        movl    $1, -12(%rbp)
        movl    $2, -8(%rbp)
        movl    -12(%rbp), %edx
        movl    -8(%rbp), %eax
        addl    %edx, %eax
        movl    %eax, -4(%rbp)
        movl    -4(%rbp), %eax
        movl    %eax, %esi
        leaq    .LC0(%rip), %rax
        movq    %rax, %rdi
        movl    $0, %eax
        call    printf@PLT
        movl    $0, %eax
        leave
        .cfi_def_cfa 7, 8
        ret
        .cfi_endproc
.LFE0:
        .size   main, .-main
        .ident  "GCC: (Ubuntu 11.3.0-1ubuntu1~22.04) 11.3.0"
        .section        .note.GNU-stack,"",@progbits
        .section        .note.gnu.property,"a"
        .align 8
        .long   1f - 0f
        .long   4f - 1f
        .long   5
0:
        .string "GNU"
1:
        .align 8
        .long   0xc0000002
        .long   3f - 2f
2:
        .long   0x3
3:
        .align 8
4:

大分違います。mov命令はなくてmovlmovq命令があります。 これがARM64とx86の違いなのでしょうか? わくわくしますね。