福野泰介の一日一創

今使ってるMacBook ProのCPUは、Intel Core i5 2.7GHz コア数:2、64bitの汎用レジスタが16個ある64bit CPU、Intel 64というマシン語が使える。

Macのコンソールに定番の「Hello World!」と表示させるマシン語のプログラムは、このようなアセンブリ言語を使って作る。

SECTION .data MESSAGE db `Hello World!\n` MESSAGE_LEN equ $-MESSAGE SECTION .text global _main _main: mov rax, 0x2000004 ; syscall 4: write mov rdi, 1 ; fd = stdout mov rsi, MESSAGE ; buffer mov rdx, MESSAGE_LEN ; size syscall mov rax, 0x2000001 ; syscall 1: exit mov rdi, 0 ; retcode syscall

アセンブリ言語をアセンブラというソフトを使ってマシン語を生成することをアセンブルと呼ぶ。(2020.1.12 -lSystem を追記)

nasm -f macho64 hello.s ld -lSystem -o hello hello.o ./hello

アセンブラは、NASMというオープンソースなソフトを使う。
Macに入っているバージョンは 0.98.40 と古くIntel 64に非対応だったので、最新版 2.12.02 をダウンロード。

brew install nasm

画面の表示は、raxなどレジスタに画面表示用のコマンド番号や、データのメモリの位置、文字数をセットしてシステムコール(syscall)というOS側に処理を依頼することで実現。プログラムの終了もシステムコールを使ってOSに伝える。(64bitモードのときは0x2000000を加えるみたい)

CPUは高速に2進数のbitをあれこれいじる機械。いじり方によって足し算になったり掛け算になったり、比較したり、次に実行するプログラムを変えたりする。Armマシン語入門で、机と表現したレジスタと、本棚をイメージすると近いRAM(メモリ)を使う設計自体は、世界初の商用マイクロプロセッサ Intel 4004(開発は、日本人、嶋正利さん!)から全く変わっていない。

Intel 4004は、45命令、レジスタは4bit、計算用のAレジスタとR0-R15の16レジスタ
Intel 8008は、68命令、レジスタは8bit、A,B,C,D,E,H,LとZ80とほぼおなじ構成
Intel 8086では、レジスタが16bitになり、AX,BX,CX,DX,SP,BP,SI,DIという構成(SI/DIはセグメント)

Intel 64はその直系で、レジスタが64bit、互換性を持ちつつ拡張された RAX,RBX,RCX,RDX,RSP,RBP,RSI,RDI にR8からR15の8レジスタが追加されている。SIMD命令などで命令数は数百(〜千オーバーかも?)と膨大だが、レジスタでいじってメモリなどに書くという基本は変わらない。

IchigoJamで使っているCortex-M0は、55命令、レジスタは32bit、R0-R15という4004に似たシンプルな設計。最新の64bit版Arm、Arm64もその延長線上にある。

エスケープシーケンスとシステムコールを使うとコンソールの画面で8色の色が使える。


座標をエスケープシーケンスで渡すためにはレジスタを10進数に変換する必要があるので、一度マシン語でつくってみると楽しい。楽しみを奪うといけないので、ソースは公開はまた後日。

PCでブートするIchigoJam PCをベースに、64bitをフルに使う特殊OSを作ってみるのもありかもしれない。

参考リンク
- Intel® 64 and IA-32 Architectures Software Developer Manuals (大元、Intelの資料)
- x64 アセンブリーの概要 | iSUS
- Tips IA32(x86)命令一覧 (32bit版だかイメージはつかめる)
- よく使うASM命令ベスト100位に説明つけてみた - おなかすいたWiki!

Tweet
クリエイティブ・コモンズ・ライセンス
この作品は「Creative Commons — CC BY 4.0」の下に提供されています。
CC BY 福野泰介 - Taisuke Fukuno / @taisukef / アイコン画像 / プロフィール画像 / RSS