読んでみます。
「第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
命令はなくてmovl
やmovq
命令があります。
これがARM64とx86の違いなのでしょうか?
わくわくしますね。