自作エミュレータで学ぶx86アーキテクチャコンピュータが動く仕組みを徹底理解!をubuntuで進める

- (3 min read)
  • OS: ubuntu16.04
  • gcc: (Ubuntu/Linaro 6.3.0-18ubuntu2~16.04) 6.3.0 20170519

Chapter1

1.3

gccコマンドは以下。-m32 で32bitバイナリにコンパイルされる

gcc -Wl,--entry=func,--oformat=binary -nostdlib -fno-asynchronous-unwind-tables -m32 -o casm-c-sample.bin casm-c-sample.c

ndisasmはapt-getでnasmをinstallすると一緒に入ってくる

sudo apt-get install nasm

Chapter2

2.3

emu2.3のMakefileを修正する必要がある

  • TARGET.exeである必要がないので、TARGET = px86
  • CCでコンパイルに利用するgccを指定している。書籍だとサンプルコード内にあるgccを使うがそれはwindow用なので、ubuntuにinstallされているgccを使う。CC = gcc
  • CCZ_TOOLSを参照しなくなったので、Z_TOOLSを削除する

最終的にMakefileは以下のようになる

TARGET = px86
OBJS = main.o

CC = gcc
CFLAGS += -Wall

.PHONY: all
all :
	make $(TARGET)

%.o : %.c Makefile
	$(CC) $(CFLAGS) -c $<

$(TARGET) : $(OBJS) Makefile
	$(CC) -o $@ $(OBJS)

Chapter3

3.2, 3.4, 3.7, 3.10, 3.12

MakefileをChapter2と同様に修正する

3.7

emu3.7のエミュレーターはMakefileをこれまで同様に修正すれば問題ないが、exec-c-testexec-arg-testMakefileはそのままではコンパイルできない。CFLAGS-m32オプションを追加し、LDFLAGS-m elf_i386オプションを追加する必要がある。 以下の様なMakefileになる

TARGET = test.bin
OBJS = crt0.o test.o
Z_TOOLS = ../z_tools

CC = gcc
LD = ld
AS = nasm
CFLAGS += -nostdlib -fno-asynchronous-unwind-tables \
	-I$(Z_TOOLS)/i386-elf-gcc/include -g -fno-stack-protector -m32
LDFLAGS += --entry=start --oformat=binary -Ttext 0x7c00 -m elf_i386

.PHONY: all
all :
	make $(TARGET)

%.o : %.c Makefile
	$(CC) $(CFLAGS) -c $<

%.o : %.asm Makefile
	$(AS) -f elf $<

$(TARGET) : $(OBJS) Makefile
	$(LD) $(LDFLAGS) -o $@ $(OBJS)

また、リスト3.29まで実装した段階でexec-c-testを試そうとすると、add_rm32_imm8が未実装のためtest.binが最後まで完走できない。add_rm32_imm8はリスト3.34で実装するので問題はないが、書籍の環境ではこの時点でadd_rm32_imm8が必要だったかどうかはわからない。もしかしたらinc_rm32が使われていたのが、gccのバージョンが変わったせいでadd_rm32_imm8が使われるようになったのかもしれないが、そこまでは確認していない。