diff --git a/nemu/.gitignore b/nemu/.gitignore
index f546b14f229efa851f08f4cb7c1e6caf012f908a..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 100644
--- a/nemu/.gitignore
+++ b/nemu/.gitignore
@@ -1,8 +0,0 @@
-*.*
-*
-!*/
-!Makefile*
-!*.[cSh]
-!.gitignore
-!README.md
-!runall.sh
diff --git a/nemu/Makefile b/nemu/Makefile
index d3966224242c2cc0aa6c442dd12aa1a2f1fc9bff..45175226dcbbaac3b4305275bba3696f66ad74d3 100644
--- a/nemu/Makefile
+++ b/nemu/Makefile
@@ -16,21 +16,21 @@ include Makefile.git
 .DEFAULT_GOAL = app
 
 # Compilation flags
-CC ?= gcc
-LD = $(CC)
+CXX ?= g++
+LD = $(CXX)
 INCLUDES  = $(addprefix -I, $(INC_DIR))
 CFLAGS   += -O2 -MMD -Wall -ggdb3 $(INCLUDES) -fomit-frame-pointer
 CFLAGS   += -DDIFF_TEST_QEMU
 
 # Files to be compiled
-SRCS = $(shell find src/ -name "*.c")
-OBJS = $(SRCS:src/%.c=$(OBJ_DIR)/%.o)
+SRCS = $(shell find src/ -name "*.cc")
+OBJS = $(SRCS:src/%.cc=$(OBJ_DIR)/%.o)
 
 # Compilation patterns
-$(OBJ_DIR)/%.o: src/%.c
-	@echo + CC $<
+$(OBJ_DIR)/%.o: src/%.cc
+	@echo + CXX $<
 	@mkdir -p $(dir $@)
-	$(CC) $(CFLAGS) $(SO_CFLAGS) -c -o $@ $<
+	$(CXX) $(CFLAGS) $(SO_CFLAGS) -c -o $@ $<
 
 
 # Depencies
@@ -50,7 +50,7 @@ NEMU_EXEC := $(BINARY) $(ARGS)
 $(BINARY): $(OBJS)
 	$(call git_commit, "compile")
 	@echo + LD $@
-	@$(LD) -O2 -rdynamic $(SO_LDLAGS) -o $@ $^ -lSDL2 -lreadline -ldl
+	@$(LD) -O2 -rdynamic $(SO_LDLAGS) -o $@ $^ -lSDL2 -lreadline -ldl -lr
 
 run: $(BINARY)
 	$(call git_commit, "run")
diff --git a/nemu/build/nemu b/nemu/build/nemu
new file mode 100755
index 0000000000000000000000000000000000000000..37908f82cd2df4e1e5480c62db05d0ff17a548b2
Binary files /dev/null and b/nemu/build/nemu differ
diff --git a/nemu/build/obj/cpu/decode/decode.d b/nemu/build/obj/cpu/decode/decode.d
new file mode 100644
index 0000000000000000000000000000000000000000..cf8d409082f6533d4b581572636ec121959673d3
--- /dev/null
+++ b/nemu/build/obj/cpu/decode/decode.d
@@ -0,0 +1,6 @@
+build/obj/cpu/decode/decode.o: src/cpu/decode/decode.cc \
+ include/cpu/exec.h include/nemu.h include/common.h include/debug.h \
+ include/macro.h include/memory/memory.h include/common.h \
+ include/cpu/reg.h include/cpu/decode.h include/cpu/rtl.h \
+ include/util/c_op.h include/cpu/relop.h include/cpu/rtl-wrapper.h \
+ include/macro.h include/cpu/rtl.h
diff --git a/nemu/build/obj/cpu/decode/decode.o b/nemu/build/obj/cpu/decode/decode.o
new file mode 100644
index 0000000000000000000000000000000000000000..8a3a8076f7b89e51427e8d8ec17677c7878ee553
Binary files /dev/null and b/nemu/build/obj/cpu/decode/decode.o differ
diff --git a/nemu/build/obj/cpu/decode/modrm.d b/nemu/build/obj/cpu/decode/modrm.d
new file mode 100644
index 0000000000000000000000000000000000000000..2eede537408e208209ac257f54417874d70e7dd6
--- /dev/null
+++ b/nemu/build/obj/cpu/decode/modrm.d
@@ -0,0 +1,6 @@
+build/obj/cpu/decode/modrm.o: src/cpu/decode/modrm.cc include/cpu/exec.h \
+ include/nemu.h include/common.h include/debug.h include/macro.h \
+ include/memory/memory.h include/common.h include/cpu/reg.h \
+ include/cpu/decode.h include/cpu/rtl.h include/util/c_op.h \
+ include/cpu/relop.h include/cpu/rtl-wrapper.h include/macro.h \
+ include/cpu/rtl.h
diff --git a/nemu/build/obj/cpu/decode/modrm.o b/nemu/build/obj/cpu/decode/modrm.o
new file mode 100644
index 0000000000000000000000000000000000000000..545ac9c7865d151205e2c37dac03d2ca042d90ae
Binary files /dev/null and b/nemu/build/obj/cpu/decode/modrm.o differ
diff --git a/nemu/build/obj/cpu/exec/arith.d b/nemu/build/obj/cpu/exec/arith.d
new file mode 100644
index 0000000000000000000000000000000000000000..5d5bd996b8735f6c90a404d191c1d5ec4ad6c0cd
--- /dev/null
+++ b/nemu/build/obj/cpu/exec/arith.d
@@ -0,0 +1,5 @@
+build/obj/cpu/exec/arith.o: src/cpu/exec/arith.cc include/cpu/exec.h \
+ include/nemu.h include/common.h include/debug.h include/macro.h \
+ include/memory/memory.h include/common.h include/cpu/reg.h \
+ include/cpu/decode.h include/cpu/rtl.h include/util/c_op.h \
+ include/cpu/relop.h include/cpu/rtl-wrapper.h include/macro.h
diff --git a/nemu/build/obj/cpu/exec/arith.o b/nemu/build/obj/cpu/exec/arith.o
new file mode 100644
index 0000000000000000000000000000000000000000..891ee60932f07ae891b560beea6835d20e9481a4
Binary files /dev/null and b/nemu/build/obj/cpu/exec/arith.o differ
diff --git a/nemu/build/obj/cpu/exec/cc.d b/nemu/build/obj/cpu/exec/cc.d
new file mode 100644
index 0000000000000000000000000000000000000000..ce59a1f6ea889a97301e37ecad64e8ff729908ed
--- /dev/null
+++ b/nemu/build/obj/cpu/exec/cc.d
@@ -0,0 +1,5 @@
+build/obj/cpu/exec/cc.o: src/cpu/exec/cc.cc include/cpu/rtl.h \
+ include/nemu.h include/common.h include/debug.h include/macro.h \
+ include/memory/memory.h include/common.h include/cpu/reg.h \
+ include/util/c_op.h include/cpu/relop.h include/cpu/rtl-wrapper.h \
+ include/macro.h
diff --git a/nemu/build/obj/cpu/exec/cc.o b/nemu/build/obj/cpu/exec/cc.o
new file mode 100644
index 0000000000000000000000000000000000000000..0e6b98423c30294d242af59b202d3d08de9892eb
Binary files /dev/null and b/nemu/build/obj/cpu/exec/cc.o differ
diff --git a/nemu/build/obj/cpu/exec/control.d b/nemu/build/obj/cpu/exec/control.d
new file mode 100644
index 0000000000000000000000000000000000000000..e06b8662ea9c28bf05b9d81382261efc4677aa51
--- /dev/null
+++ b/nemu/build/obj/cpu/exec/control.d
@@ -0,0 +1,6 @@
+build/obj/cpu/exec/control.o: src/cpu/exec/control.cc include/cpu/exec.h \
+ include/nemu.h include/common.h include/debug.h include/macro.h \
+ include/memory/memory.h include/common.h include/cpu/reg.h \
+ include/cpu/decode.h include/cpu/rtl.h include/util/c_op.h \
+ include/cpu/relop.h include/cpu/rtl-wrapper.h include/macro.h \
+ include/cpu/cc.h
diff --git a/nemu/build/obj/cpu/exec/control.o b/nemu/build/obj/cpu/exec/control.o
new file mode 100644
index 0000000000000000000000000000000000000000..31090c00c8a6f7b95a2f6586fac74b595280a1d4
Binary files /dev/null and b/nemu/build/obj/cpu/exec/control.o differ
diff --git a/nemu/build/obj/cpu/exec/data-mov.d b/nemu/build/obj/cpu/exec/data-mov.d
new file mode 100644
index 0000000000000000000000000000000000000000..b77dae33f20ed5fabb7bf219d4e2da3bd2ffcac9
--- /dev/null
+++ b/nemu/build/obj/cpu/exec/data-mov.d
@@ -0,0 +1,6 @@
+build/obj/cpu/exec/data-mov.o: src/cpu/exec/data-mov.cc \
+ include/cpu/exec.h include/nemu.h include/common.h include/debug.h \
+ include/macro.h include/memory/memory.h include/common.h \
+ include/cpu/reg.h include/cpu/decode.h include/cpu/rtl.h \
+ include/util/c_op.h include/cpu/relop.h include/cpu/rtl-wrapper.h \
+ include/macro.h
diff --git a/nemu/build/obj/cpu/exec/data-mov.o b/nemu/build/obj/cpu/exec/data-mov.o
new file mode 100644
index 0000000000000000000000000000000000000000..ccc01b64056b8abfc2c1df028d171ea9a62e6ab0
Binary files /dev/null and b/nemu/build/obj/cpu/exec/data-mov.o differ
diff --git a/nemu/build/obj/cpu/exec/exec.d b/nemu/build/obj/cpu/exec/exec.d
new file mode 100644
index 0000000000000000000000000000000000000000..08b57abe0579c584f09f8082c1553600b2fcbc94
--- /dev/null
+++ b/nemu/build/obj/cpu/exec/exec.d
@@ -0,0 +1,6 @@
+build/obj/cpu/exec/exec.o: src/cpu/exec/exec.cc include/cpu/exec.h \
+ include/nemu.h include/common.h include/debug.h include/macro.h \
+ include/memory/memory.h include/common.h include/cpu/reg.h \
+ include/cpu/decode.h include/cpu/rtl.h include/util/c_op.h \
+ include/cpu/relop.h include/cpu/rtl-wrapper.h include/macro.h \
+ src/cpu/exec/all-instr.h
diff --git a/nemu/build/obj/cpu/exec/exec.o b/nemu/build/obj/cpu/exec/exec.o
new file mode 100644
index 0000000000000000000000000000000000000000..16baabb8232196210718092eab9b1511ab73871a
Binary files /dev/null and b/nemu/build/obj/cpu/exec/exec.o differ
diff --git a/nemu/build/obj/cpu/exec/logic.d b/nemu/build/obj/cpu/exec/logic.d
new file mode 100644
index 0000000000000000000000000000000000000000..eff0f17b87aa7c92c970b7df1bf0340f74230473
--- /dev/null
+++ b/nemu/build/obj/cpu/exec/logic.d
@@ -0,0 +1,6 @@
+build/obj/cpu/exec/logic.o: src/cpu/exec/logic.cc include/cpu/exec.h \
+ include/nemu.h include/common.h include/debug.h include/macro.h \
+ include/memory/memory.h include/common.h include/cpu/reg.h \
+ include/cpu/decode.h include/cpu/rtl.h include/util/c_op.h \
+ include/cpu/relop.h include/cpu/rtl-wrapper.h include/macro.h \
+ include/cpu/cc.h
diff --git a/nemu/build/obj/cpu/exec/logic.o b/nemu/build/obj/cpu/exec/logic.o
new file mode 100644
index 0000000000000000000000000000000000000000..0044ef60bda5c0881109fcf617e2c6261ed365db
Binary files /dev/null and b/nemu/build/obj/cpu/exec/logic.o differ
diff --git a/nemu/build/obj/cpu/exec/prefix.d b/nemu/build/obj/cpu/exec/prefix.d
new file mode 100644
index 0000000000000000000000000000000000000000..e23050add5313587c48a4fe3fe0dc6b547cb980b
--- /dev/null
+++ b/nemu/build/obj/cpu/exec/prefix.d
@@ -0,0 +1,5 @@
+build/obj/cpu/exec/prefix.o: src/cpu/exec/prefix.cc include/cpu/exec.h \
+ include/nemu.h include/common.h include/debug.h include/macro.h \
+ include/memory/memory.h include/common.h include/cpu/reg.h \
+ include/cpu/decode.h include/cpu/rtl.h include/util/c_op.h \
+ include/cpu/relop.h include/cpu/rtl-wrapper.h include/macro.h
diff --git a/nemu/build/obj/cpu/exec/prefix.o b/nemu/build/obj/cpu/exec/prefix.o
new file mode 100644
index 0000000000000000000000000000000000000000..e40de0e0eaa436acfad1ca45ba95af4329720b05
Binary files /dev/null and b/nemu/build/obj/cpu/exec/prefix.o differ
diff --git a/nemu/build/obj/cpu/exec/relop.d b/nemu/build/obj/cpu/exec/relop.d
new file mode 100644
index 0000000000000000000000000000000000000000..a68471574013a2c4fdc1f995d7fa4555fded1c35
--- /dev/null
+++ b/nemu/build/obj/cpu/exec/relop.d
@@ -0,0 +1,2 @@
+build/obj/cpu/exec/relop.o: src/cpu/exec/relop.cc include/common.h \
+ include/debug.h include/common.h include/macro.h include/cpu/relop.h
diff --git a/nemu/build/obj/cpu/exec/relop.o b/nemu/build/obj/cpu/exec/relop.o
new file mode 100644
index 0000000000000000000000000000000000000000..820eb8730911531c490eafbc5f869373d288b819
Binary files /dev/null and b/nemu/build/obj/cpu/exec/relop.o differ
diff --git a/nemu/build/obj/cpu/exec/special.d b/nemu/build/obj/cpu/exec/special.d
new file mode 100644
index 0000000000000000000000000000000000000000..a395f91fdb9eba76b472c2c9a62ad5bfc8f91f26
--- /dev/null
+++ b/nemu/build/obj/cpu/exec/special.d
@@ -0,0 +1,6 @@
+build/obj/cpu/exec/special.o: src/cpu/exec/special.cc include/cpu/exec.h \
+ include/nemu.h include/common.h include/debug.h include/macro.h \
+ include/memory/memory.h include/common.h include/cpu/reg.h \
+ include/cpu/decode.h include/cpu/rtl.h include/util/c_op.h \
+ include/cpu/relop.h include/cpu/rtl-wrapper.h include/macro.h \
+ include/monitor/monitor.h
diff --git a/nemu/build/obj/cpu/exec/special.o b/nemu/build/obj/cpu/exec/special.o
new file mode 100644
index 0000000000000000000000000000000000000000..0658eddf97a80928267b709c149eedac3d26213f
Binary files /dev/null and b/nemu/build/obj/cpu/exec/special.o differ
diff --git a/nemu/build/obj/cpu/exec/system.d b/nemu/build/obj/cpu/exec/system.d
new file mode 100644
index 0000000000000000000000000000000000000000..714c33bbb3c8886f938ec366172d9c78b9f3bc26
--- /dev/null
+++ b/nemu/build/obj/cpu/exec/system.d
@@ -0,0 +1,5 @@
+build/obj/cpu/exec/system.o: src/cpu/exec/system.cc include/cpu/exec.h \
+ include/nemu.h include/common.h include/debug.h include/macro.h \
+ include/memory/memory.h include/common.h include/cpu/reg.h \
+ include/cpu/decode.h include/cpu/rtl.h include/util/c_op.h \
+ include/cpu/relop.h include/cpu/rtl-wrapper.h include/macro.h
diff --git a/nemu/build/obj/cpu/exec/system.o b/nemu/build/obj/cpu/exec/system.o
new file mode 100644
index 0000000000000000000000000000000000000000..3d551463e69f6adc5938ccce37d29c3d1fb2f333
Binary files /dev/null and b/nemu/build/obj/cpu/exec/system.o differ
diff --git a/nemu/build/obj/cpu/intr.d b/nemu/build/obj/cpu/intr.d
new file mode 100644
index 0000000000000000000000000000000000000000..860d341e244c7b15fc1ccb94ebd13e3cf104c6e4
--- /dev/null
+++ b/nemu/build/obj/cpu/intr.d
@@ -0,0 +1,5 @@
+build/obj/cpu/intr.o: src/cpu/intr.cc include/cpu/exec.h include/nemu.h \
+ include/common.h include/debug.h include/macro.h include/memory/memory.h \
+ include/common.h include/cpu/reg.h include/cpu/decode.h \
+ include/cpu/rtl.h include/util/c_op.h include/cpu/relop.h \
+ include/cpu/rtl-wrapper.h include/macro.h include/memory/mmu.h
diff --git a/nemu/build/obj/cpu/intr.o b/nemu/build/obj/cpu/intr.o
new file mode 100644
index 0000000000000000000000000000000000000000..01b0f26ed4ca6ef043e2a617c55ba03eeb0dbec7
Binary files /dev/null and b/nemu/build/obj/cpu/intr.o differ
diff --git a/nemu/build/obj/cpu/reg.d b/nemu/build/obj/cpu/reg.d
new file mode 100644
index 0000000000000000000000000000000000000000..57dfa53cd7ff400831ef0dd27e3491934d7a4c20
--- /dev/null
+++ b/nemu/build/obj/cpu/reg.d
@@ -0,0 +1,3 @@
+build/obj/cpu/reg.o: src/cpu/reg.cc include/nemu.h include/common.h \
+ include/debug.h include/macro.h include/memory/memory.h include/common.h \
+ include/cpu/reg.h
diff --git a/nemu/build/obj/cpu/reg.o b/nemu/build/obj/cpu/reg.o
new file mode 100644
index 0000000000000000000000000000000000000000..451237ba6dd9d0b064dc73cc1ccee2609c53d268
Binary files /dev/null and b/nemu/build/obj/cpu/reg.o differ
diff --git a/nemu/build/obj/device/device.d b/nemu/build/obj/device/device.d
new file mode 100644
index 0000000000000000000000000000000000000000..db086e90cbabaaaae3634b0a7ca5ff72905c5acb
--- /dev/null
+++ b/nemu/build/obj/device/device.d
@@ -0,0 +1,2 @@
+build/obj/device/device.o: src/device/device.cc include/common.h \
+ include/debug.h include/common.h include/macro.h
diff --git a/nemu/build/obj/device/device.o b/nemu/build/obj/device/device.o
new file mode 100644
index 0000000000000000000000000000000000000000..62f69ef9e0a12b44a1aab1b51637eb15c5224cde
Binary files /dev/null and b/nemu/build/obj/device/device.o differ
diff --git a/nemu/build/obj/device/io/mmio.d b/nemu/build/obj/device/io/mmio.d
new file mode 100644
index 0000000000000000000000000000000000000000..3311072b8ee06b58cf709eed4bf9298578d6d67b
--- /dev/null
+++ b/nemu/build/obj/device/io/mmio.d
@@ -0,0 +1,2 @@
+build/obj/device/io/mmio.o: src/device/io/mmio.cc include/common.h \
+ include/debug.h include/common.h include/macro.h include/device/mmio.h
diff --git a/nemu/build/obj/device/io/mmio.o b/nemu/build/obj/device/io/mmio.o
new file mode 100644
index 0000000000000000000000000000000000000000..740ab9162509da5f763c2ee39e176fd1e304ba7b
Binary files /dev/null and b/nemu/build/obj/device/io/mmio.o differ
diff --git a/nemu/build/obj/device/io/port-io.d b/nemu/build/obj/device/io/port-io.d
new file mode 100644
index 0000000000000000000000000000000000000000..bb5c5bb567b438e66a9c3516b5a46a1652dd07fb
--- /dev/null
+++ b/nemu/build/obj/device/io/port-io.d
@@ -0,0 +1,3 @@
+build/obj/device/io/port-io.o: src/device/io/port-io.cc include/common.h \
+ include/debug.h include/common.h include/macro.h \
+ include/device/port-io.h
diff --git a/nemu/build/obj/device/io/port-io.o b/nemu/build/obj/device/io/port-io.o
new file mode 100644
index 0000000000000000000000000000000000000000..0fbc2d0bbed86e1bee8945dea98d6979d4adbc63
Binary files /dev/null and b/nemu/build/obj/device/io/port-io.o differ
diff --git a/nemu/build/obj/device/keyboard.d b/nemu/build/obj/device/keyboard.d
new file mode 100644
index 0000000000000000000000000000000000000000..11f95cdf72a8dbebb48726ead7f78d67e568ab4b
--- /dev/null
+++ b/nemu/build/obj/device/keyboard.d
@@ -0,0 +1,3 @@
+build/obj/device/keyboard.o: src/device/keyboard.cc \
+ include/device/port-io.h include/common.h include/debug.h \
+ include/common.h include/macro.h include/monitor/monitor.h
diff --git a/nemu/build/obj/device/keyboard.o b/nemu/build/obj/device/keyboard.o
new file mode 100644
index 0000000000000000000000000000000000000000..cc25dcef80208d75cb865e945e2b16ac54ef6757
Binary files /dev/null and b/nemu/build/obj/device/keyboard.o differ
diff --git a/nemu/build/obj/device/serial.d b/nemu/build/obj/device/serial.d
new file mode 100644
index 0000000000000000000000000000000000000000..ff1884fbc5e5a85e42fbe089ff5d9dfd02039ef7
--- /dev/null
+++ b/nemu/build/obj/device/serial.d
@@ -0,0 +1,3 @@
+build/obj/device/serial.o: src/device/serial.cc include/common.h \
+ include/debug.h include/common.h include/macro.h \
+ include/device/port-io.h
diff --git a/nemu/build/obj/device/serial.o b/nemu/build/obj/device/serial.o
new file mode 100644
index 0000000000000000000000000000000000000000..3b03f65a09427cf10c6daa420a8ea7d8589dce38
Binary files /dev/null and b/nemu/build/obj/device/serial.o differ
diff --git a/nemu/build/obj/device/timer.d b/nemu/build/obj/device/timer.d
new file mode 100644
index 0000000000000000000000000000000000000000..14e134fea662a3757f0be7f72293f156d8ae7f0b
--- /dev/null
+++ b/nemu/build/obj/device/timer.d
@@ -0,0 +1,3 @@
+build/obj/device/timer.o: src/device/timer.cc include/device/port-io.h \
+ include/common.h include/debug.h include/common.h include/macro.h \
+ include/monitor/monitor.h
diff --git a/nemu/build/obj/device/timer.o b/nemu/build/obj/device/timer.o
new file mode 100644
index 0000000000000000000000000000000000000000..4a1b6a7606aa0fe0fb72eed77639f5374c261c3d
Binary files /dev/null and b/nemu/build/obj/device/timer.o differ
diff --git a/nemu/build/obj/device/vga.d b/nemu/build/obj/device/vga.d
new file mode 100644
index 0000000000000000000000000000000000000000..4ce8ab974f453c5e8014af711732ac19a94ad0c9
--- /dev/null
+++ b/nemu/build/obj/device/vga.d
@@ -0,0 +1,2 @@
+build/obj/device/vga.o: src/device/vga.cc include/common.h \
+ include/debug.h include/common.h include/macro.h
diff --git a/nemu/build/obj/device/vga.o b/nemu/build/obj/device/vga.o
new file mode 100644
index 0000000000000000000000000000000000000000..21112916c507c41cffcfb42c0081c39a0ed6e79a
Binary files /dev/null and b/nemu/build/obj/device/vga.o differ
diff --git a/nemu/build/obj/main.d b/nemu/build/obj/main.d
new file mode 100644
index 0000000000000000000000000000000000000000..ca04beb3909731f6ddbb6d65169bc55b952213c7
--- /dev/null
+++ b/nemu/build/obj/main.d
@@ -0,0 +1 @@
+build/obj/main.o: src/main.cc
diff --git a/nemu/build/obj/main.o b/nemu/build/obj/main.o
new file mode 100644
index 0000000000000000000000000000000000000000..45fa09190d28dd7ec816cb735dc1cca73b65abe0
Binary files /dev/null and b/nemu/build/obj/main.o differ
diff --git a/nemu/build/obj/memory/memory.d b/nemu/build/obj/memory/memory.d
new file mode 100644
index 0000000000000000000000000000000000000000..808cde41359548988c9c0579c4feeba73d3a87d8
--- /dev/null
+++ b/nemu/build/obj/memory/memory.d
@@ -0,0 +1,3 @@
+build/obj/memory/memory.o: src/memory/memory.cc include/nemu.h \
+ include/common.h include/debug.h include/macro.h include/memory/memory.h \
+ include/common.h include/cpu/reg.h
diff --git a/nemu/build/obj/memory/memory.o b/nemu/build/obj/memory/memory.o
new file mode 100644
index 0000000000000000000000000000000000000000..626c5c32f277d40aef63e3d402b52d93f64a26bc
Binary files /dev/null and b/nemu/build/obj/memory/memory.o differ
diff --git a/nemu/build/obj/misc/logo.d b/nemu/build/obj/misc/logo.d
new file mode 100644
index 0000000000000000000000000000000000000000..4dc8a9fde520919270c320dc95ab50555d971e25
--- /dev/null
+++ b/nemu/build/obj/misc/logo.d
@@ -0,0 +1 @@
+build/obj/misc/logo.o: src/misc/logo.cc
diff --git a/nemu/build/obj/misc/logo.o b/nemu/build/obj/misc/logo.o
new file mode 100644
index 0000000000000000000000000000000000000000..e0e52d5881e20e46530279e0e398bc68f281a809
Binary files /dev/null and b/nemu/build/obj/misc/logo.o differ
diff --git a/nemu/build/obj/monitor/cpu-exec.d b/nemu/build/obj/monitor/cpu-exec.d
new file mode 100644
index 0000000000000000000000000000000000000000..84922648b65c9b1ef76a3fe0e95f32a356602aa7
--- /dev/null
+++ b/nemu/build/obj/monitor/cpu-exec.d
@@ -0,0 +1,3 @@
+build/obj/monitor/cpu-exec.o: src/monitor/cpu-exec.cc include/nemu.h \
+ include/common.h include/debug.h include/macro.h include/memory/memory.h \
+ include/common.h include/cpu/reg.h include/monitor/monitor.h
diff --git a/nemu/build/obj/monitor/cpu-exec.o b/nemu/build/obj/monitor/cpu-exec.o
new file mode 100644
index 0000000000000000000000000000000000000000..f14f130a95aa89b4b4460c54a567355d95a9c84d
Binary files /dev/null and b/nemu/build/obj/monitor/cpu-exec.o differ
diff --git a/nemu/build/obj/monitor/debug/expr.d b/nemu/build/obj/monitor/debug/expr.d
new file mode 100644
index 0000000000000000000000000000000000000000..8f5a02a1d67fe9352bba2c1aa7a1ac480489c350
--- /dev/null
+++ b/nemu/build/obj/monitor/debug/expr.d
@@ -0,0 +1,3 @@
+build/obj/monitor/debug/expr.o: src/monitor/debug/expr.cc include/nemu.h \
+ include/common.h include/debug.h include/macro.h include/memory/memory.h \
+ include/common.h include/cpu/reg.h
diff --git a/nemu/build/obj/monitor/debug/expr.o b/nemu/build/obj/monitor/debug/expr.o
new file mode 100644
index 0000000000000000000000000000000000000000..4b07ace8b1634493ff430ecdb67cb06b9b329dd3
Binary files /dev/null and b/nemu/build/obj/monitor/debug/expr.o differ
diff --git a/nemu/build/obj/monitor/debug/ui.d b/nemu/build/obj/monitor/debug/ui.d
new file mode 100644
index 0000000000000000000000000000000000000000..f7d8124db7ca7154b5d8bd9009a3c73c5ed7fc2c
--- /dev/null
+++ b/nemu/build/obj/monitor/debug/ui.d
@@ -0,0 +1,5 @@
+build/obj/monitor/debug/ui.o: src/monitor/debug/ui.cc \
+ include/monitor/monitor.h include/monitor/expr.h include/common.h \
+ include/debug.h include/common.h include/macro.h \
+ include/monitor/watchpoint.h include/nemu.h include/memory/memory.h \
+ include/cpu/reg.h
diff --git a/nemu/build/obj/monitor/debug/ui.o b/nemu/build/obj/monitor/debug/ui.o
new file mode 100644
index 0000000000000000000000000000000000000000..550cd7f2ed9892ef1b555b277dce41afe1071f3e
Binary files /dev/null and b/nemu/build/obj/monitor/debug/ui.o differ
diff --git a/nemu/build/obj/monitor/debug/watchpoint.d b/nemu/build/obj/monitor/debug/watchpoint.d
new file mode 100644
index 0000000000000000000000000000000000000000..4e0225e7cc3f3576c580754288d12f8d89b366df
--- /dev/null
+++ b/nemu/build/obj/monitor/debug/watchpoint.d
@@ -0,0 +1,3 @@
+build/obj/monitor/debug/watchpoint.o: src/monitor/debug/watchpoint.cc \
+ include/monitor/watchpoint.h include/common.h include/debug.h \
+ include/common.h include/macro.h include/monitor/expr.h
diff --git a/nemu/build/obj/monitor/debug/watchpoint.o b/nemu/build/obj/monitor/debug/watchpoint.o
new file mode 100644
index 0000000000000000000000000000000000000000..f3f5bc5ea84ca25a3c40b238325fd9ddb18efb00
Binary files /dev/null and b/nemu/build/obj/monitor/debug/watchpoint.o differ
diff --git a/nemu/build/obj/monitor/diff-test/diff-test.d b/nemu/build/obj/monitor/diff-test/diff-test.d
new file mode 100644
index 0000000000000000000000000000000000000000..514bd7a787f17fbe320ff080e4dab345643ad9e7
--- /dev/null
+++ b/nemu/build/obj/monitor/diff-test/diff-test.d
@@ -0,0 +1,5 @@
+build/obj/monitor/diff-test/diff-test.o: \
+ src/monitor/diff-test/diff-test.cc include/nemu.h include/common.h \
+ include/debug.h include/macro.h include/memory/memory.h include/common.h \
+ include/cpu/reg.h include/monitor/monitor.h \
+ src/monitor/diff-test/diff-test.h
diff --git a/nemu/build/obj/monitor/diff-test/diff-test.o b/nemu/build/obj/monitor/diff-test/diff-test.o
new file mode 100644
index 0000000000000000000000000000000000000000..7cd8b78eb0cd668c2682f80c6214d9c0c597df25
Binary files /dev/null and b/nemu/build/obj/monitor/diff-test/diff-test.o differ
diff --git a/nemu/build/obj/monitor/diff-test/ref.d b/nemu/build/obj/monitor/diff-test/ref.d
new file mode 100644
index 0000000000000000000000000000000000000000..31e38a4ef7401d98c44cdadf5cad186cc02a25a9
--- /dev/null
+++ b/nemu/build/obj/monitor/diff-test/ref.d
@@ -0,0 +1,4 @@
+build/obj/monitor/diff-test/ref.o: src/monitor/diff-test/ref.cc \
+ include/nemu.h include/common.h include/debug.h include/macro.h \
+ include/memory/memory.h include/common.h include/cpu/reg.h \
+ src/monitor/diff-test/diff-test.h
diff --git a/nemu/build/obj/monitor/diff-test/ref.o b/nemu/build/obj/monitor/diff-test/ref.o
new file mode 100644
index 0000000000000000000000000000000000000000..81999594c0c0733072db4b84e86d22c2c8ffc02c
Binary files /dev/null and b/nemu/build/obj/monitor/diff-test/ref.o differ
diff --git a/nemu/build/obj/monitor/monitor.d b/nemu/build/obj/monitor/monitor.d
new file mode 100644
index 0000000000000000000000000000000000000000..5b2fad4798e29c737b3980bfdde518e3c7f793d8
--- /dev/null
+++ b/nemu/build/obj/monitor/monitor.d
@@ -0,0 +1,3 @@
+build/obj/monitor/monitor.o: src/monitor/monitor.cc include/nemu.h \
+ include/common.h include/debug.h include/macro.h include/memory/memory.h \
+ include/common.h include/cpu/reg.h include/monitor/monitor.h
diff --git a/nemu/build/obj/monitor/monitor.o b/nemu/build/obj/monitor/monitor.o
new file mode 100644
index 0000000000000000000000000000000000000000..9cff86a92ba8478d82f768a343624d5180ac5903
Binary files /dev/null and b/nemu/build/obj/monitor/monitor.o differ
diff --git a/nemu/include/common.h b/nemu/include/common.h
index 9f0aaf0472e8afb7779857c5b8b55822c7e97e62..44d6c1a11d62a31f38517dae3a5b025f70fe159d 100644
--- a/nemu/include/common.h
+++ b/nemu/include/common.h
@@ -17,8 +17,6 @@
 #include <assert.h>
 #include <string.h>
 
-typedef uint8_t bool;
-
 typedef uint32_t rtlreg_t;
 
 typedef uint32_t paddr_t;
@@ -26,9 +24,6 @@ typedef uint32_t vaddr_t;
 
 typedef uint16_t ioaddr_t;
 
-#define false 0
-#define true 1
-
 #include "debug.h"
 #include "macro.h"
 
diff --git a/nemu/include/cpu/exec.h b/nemu/include/cpu/exec.h
index 6ba7005c24517b82a8ce127f73646977cb1ce5f5..21b8e537e66b9cb79eb7d4f5a56c55fff7a2b4d3 100644
--- a/nemu/include/cpu/exec.h
+++ b/nemu/include/cpu/exec.h
@@ -11,7 +11,7 @@ typedef void (*EHelper) (vaddr_t *);
 static inline uint32_t instr_fetch(vaddr_t *eip, int len) {
   uint32_t instr = vaddr_read(*eip, len);
 #ifdef DEBUG
-  uint8_t *p_instr = (void *)&instr;
+  uint8_t *p_instr = (uint8_t *)&instr;
   int i;
   for (i = 0; i < len; i ++) {
     decoding.p += sprintf(decoding.p, "%02x ", p_instr[i]);
@@ -30,12 +30,12 @@ static inline uint32_t instr_fetch(vaddr_t *eip, int len) {
 #define suffix_char(width) ((width) == 4 ? 'l' : ((width) == 1 ? 'b' : ((width) == 2 ? 'w' : '?')))
 
 #define print_asm_template1(instr) \
-  print_asm(str(instr) "%c %s", suffix_char(id_dest->width), id_dest->str)
+  print_asm(RLIB_MACRO_TO_CSTR(instr) "%c %s", suffix_char(id_dest->width), id_dest->str)
 
 #define print_asm_template2(instr) \
-  print_asm(str(instr) "%c %s,%s", suffix_char(id_dest->width), id_src->str, id_dest->str)
+  print_asm(RLIB_MACRO_TO_CSTR(instr) "%c %s,%s", suffix_char(id_dest->width), id_src->str, id_dest->str)
 
 #define print_asm_template3(instr) \
-  print_asm(str(instr) "%c %s,%s,%s", suffix_char(id_dest->width), id_src->str, id_src2->str, id_dest->str)
+  print_asm(RLIB_MACRO_TO_CSTR(instr) "%c %s,%s,%s", suffix_char(id_dest->width), id_src->str, id_src2->str, id_dest->str)
 
 #endif
diff --git a/nemu/include/macro.h b/nemu/include/macro.h
index 0f5cc95252db931c3a006709d8d6fcc6d7fa6cdc..20263916dfc743cebb8878bd52c52034cd68f683 100644
--- a/nemu/include/macro.h
+++ b/nemu/include/macro.h
@@ -1,8 +1,14 @@
 #ifndef __MACRO_H__
 #define __MACRO_H__
 
-#define str_temp(x) #x
-#define str(x) str_temp(x)
+// From rlib/macro.hpp
+#ifndef _RLIB_MACRO_ENSTRING
+#define _RLIB_MACRO_ENSTRING(_s) #_s
+#endif
+
+#ifndef RLIB_MACRO_TO_CSTR
+#define RLIB_MACRO_TO_CSTR(m) _RLIB_MACRO_ENSTRING(m)
+#endif
 
 #define concat_temp(x, y) x ## y
 #define concat(x, y) concat_temp(x, y)
diff --git a/nemu/src/cpu/decode/decode.c b/nemu/src/cpu/decode/decode.cc
similarity index 100%
rename from nemu/src/cpu/decode/decode.c
rename to nemu/src/cpu/decode/decode.cc
diff --git a/nemu/src/cpu/decode/modrm.c b/nemu/src/cpu/decode/modrm.cc
similarity index 100%
rename from nemu/src/cpu/decode/modrm.c
rename to nemu/src/cpu/decode/modrm.cc
diff --git a/nemu/src/cpu/exec/arith.c b/nemu/src/cpu/exec/arith.cc
similarity index 100%
rename from nemu/src/cpu/exec/arith.c
rename to nemu/src/cpu/exec/arith.cc
diff --git a/nemu/src/cpu/exec/cc.c b/nemu/src/cpu/exec/cc.cc
similarity index 100%
rename from nemu/src/cpu/exec/cc.c
rename to nemu/src/cpu/exec/cc.cc
diff --git a/nemu/src/cpu/exec/control.c b/nemu/src/cpu/exec/control.cc
similarity index 100%
rename from nemu/src/cpu/exec/control.c
rename to nemu/src/cpu/exec/control.cc
diff --git a/nemu/src/cpu/exec/data-mov.c b/nemu/src/cpu/exec/data-mov.cc
similarity index 100%
rename from nemu/src/cpu/exec/data-mov.c
rename to nemu/src/cpu/exec/data-mov.cc
diff --git a/nemu/src/cpu/exec/exec.c b/nemu/src/cpu/exec/exec.cc
similarity index 100%
rename from nemu/src/cpu/exec/exec.c
rename to nemu/src/cpu/exec/exec.cc
diff --git a/nemu/src/cpu/exec/logic.c b/nemu/src/cpu/exec/logic.cc
similarity index 100%
rename from nemu/src/cpu/exec/logic.c
rename to nemu/src/cpu/exec/logic.cc
diff --git a/nemu/src/cpu/exec/prefix.c b/nemu/src/cpu/exec/prefix.cc
similarity index 100%
rename from nemu/src/cpu/exec/prefix.c
rename to nemu/src/cpu/exec/prefix.cc
diff --git a/nemu/src/cpu/exec/relop.c b/nemu/src/cpu/exec/relop.cc
similarity index 100%
rename from nemu/src/cpu/exec/relop.c
rename to nemu/src/cpu/exec/relop.cc
diff --git a/nemu/src/cpu/exec/special.c b/nemu/src/cpu/exec/special.cc
similarity index 97%
rename from nemu/src/cpu/exec/special.c
rename to nemu/src/cpu/exec/special.cc
index fb5d51dd304b51c3497816945de51a5d2bc7f048..9580a48167cbbd22f4e3b12ae0f65367d1b618dd 100644
--- a/nemu/src/cpu/exec/special.c
+++ b/nemu/src/cpu/exec/special.cc
@@ -18,7 +18,7 @@ make_EHelper(inv) {
   temp[0] = instr_fetch(eip, 4);
   temp[1] = instr_fetch(eip, 4);
 
-  uint8_t *p = (void *)temp;
+  uint8_t *p = (uint8_t *)temp;
   printf("invalid opcode(eip = 0x%08x): %02x %02x %02x %02x %02x %02x %02x %02x ...\n\n",
       ori_eip, p[0], p[1], p[2], p[3], p[4], p[5], p[6], p[7]);
 
diff --git a/nemu/src/cpu/exec/system.c b/nemu/src/cpu/exec/system.cc
similarity index 100%
rename from nemu/src/cpu/exec/system.c
rename to nemu/src/cpu/exec/system.cc
diff --git a/nemu/src/cpu/intr.c b/nemu/src/cpu/intr.cc
similarity index 100%
rename from nemu/src/cpu/intr.c
rename to nemu/src/cpu/intr.cc
diff --git a/nemu/src/cpu/reg.c b/nemu/src/cpu/reg.cc
similarity index 100%
rename from nemu/src/cpu/reg.c
rename to nemu/src/cpu/reg.cc
diff --git a/nemu/src/device/device.c b/nemu/src/device/device.cc
similarity index 100%
rename from nemu/src/device/device.c
rename to nemu/src/device/device.cc
diff --git a/nemu/src/device/io/mmio.c b/nemu/src/device/io/mmio.cc
similarity index 100%
rename from nemu/src/device/io/mmio.c
rename to nemu/src/device/io/mmio.cc
diff --git a/nemu/src/device/io/port-io.c b/nemu/src/device/io/port-io.cc
similarity index 100%
rename from nemu/src/device/io/port-io.c
rename to nemu/src/device/io/port-io.cc
diff --git a/nemu/src/device/keyboard.c b/nemu/src/device/keyboard.cc
similarity index 85%
rename from nemu/src/device/keyboard.c
rename to nemu/src/device/keyboard.cc
index a801460e1b3e446e5f5944e602dcb43582c74b6a..50859e5339f0fd039fa7a9d623a948fac2b92823 100644
--- a/nemu/src/device/keyboard.c
+++ b/nemu/src/device/keyboard.cc
@@ -24,10 +24,14 @@ enum {
   _KEYS(_KEY_NAME)
 };
 
-#define XX(k) [concat(SDL_SCANCODE_, k)] = concat(_KEY_, k),
-static uint32_t keymap[256] = {
-  _KEYS(XX)
-};
+#define XX(k) keymap[concat(SDL_SCANCODE_, k)] = concat(_KEY_, k);
+static uint32_t keymap[256] = {};
+
+static struct keymap_initializer {
+  keymap_initializer() {
+    _KEYS(XX)
+  }
+} _keymap_initializer;
 
 #define KEY_QUEUE_LEN 1024
 static int key_queue[KEY_QUEUE_LEN];
@@ -58,6 +62,6 @@ static void i8042_data_io_handler(ioaddr_t addr, int len, bool is_write) {
 }
 
 void init_i8042() {
-  i8042_data_port_base = add_pio_map(I8042_DATA_PORT, 4, i8042_data_io_handler);
+  i8042_data_port_base = (uint32_t *)add_pio_map(I8042_DATA_PORT, 4, i8042_data_io_handler);
   i8042_data_port_base[0] = _KEY_NONE;
 }
diff --git a/nemu/src/device/serial.c b/nemu/src/device/serial.cc
similarity index 78%
rename from nemu/src/device/serial.c
rename to nemu/src/device/serial.cc
index 69b1b4809b78f7701930247574e5fe4ed6d0308c..17a5b65a9d5d937a9338a497d87e092961cf4557 100644
--- a/nemu/src/device/serial.c
+++ b/nemu/src/device/serial.cc
@@ -22,7 +22,7 @@ static void serial_ch_io_handler(ioaddr_t addr, int len, bool is_write) {
 }
 
 void init_serial() {
-  serial_ch_base = add_pio_map(SERIAL_PORT + CH_OFFSET, 1, serial_ch_io_handler);
-  serial_lsr_base = add_pio_map(SERIAL_PORT + LSR_OFFSET, 1, NULL);
+  serial_ch_base = (uint8_t *)add_pio_map(SERIAL_PORT + CH_OFFSET, 1, serial_ch_io_handler);
+  serial_lsr_base = (uint8_t *)add_pio_map(SERIAL_PORT + LSR_OFFSET, 1, NULL);
   serial_lsr_base[0] = 0x20; /* the status is always free */
 }
diff --git a/nemu/src/device/timer.c b/nemu/src/device/timer.cc
similarity index 89%
rename from nemu/src/device/timer.c
rename to nemu/src/device/timer.cc
index bb28621ae5029305e44828cfaf08a4b5cef7b544..9fd1ea7256addfacb9b0026e089ea1d8e84304f9 100644
--- a/nemu/src/device/timer.c
+++ b/nemu/src/device/timer.cc
@@ -24,5 +24,5 @@ void rtc_io_handler(ioaddr_t addr, int len, bool is_write) {
 }
 
 void init_timer() {
-  rtc_port_base = add_pio_map(RTC_PORT, 4, rtc_io_handler);
+  rtc_port_base = (uint32_t *)add_pio_map(RTC_PORT, 4, rtc_io_handler);
 }
diff --git a/nemu/src/device/vga.c b/nemu/src/device/vga.cc
similarity index 100%
rename from nemu/src/device/vga.c
rename to nemu/src/device/vga.cc
diff --git a/nemu/src/main.c b/nemu/src/main.cc
similarity index 100%
rename from nemu/src/main.c
rename to nemu/src/main.cc
diff --git a/nemu/src/memory/memory.c b/nemu/src/memory/memory.cc
similarity index 100%
rename from nemu/src/memory/memory.c
rename to nemu/src/memory/memory.cc
diff --git a/nemu/src/misc/logo.c b/nemu/src/misc/logo.cc
similarity index 100%
rename from nemu/src/misc/logo.c
rename to nemu/src/misc/logo.cc
diff --git a/nemu/src/monitor/cpu-exec.c b/nemu/src/monitor/cpu-exec.cc
similarity index 100%
rename from nemu/src/monitor/cpu-exec.c
rename to nemu/src/monitor/cpu-exec.cc
diff --git a/nemu/src/monitor/debug/expr.c b/nemu/src/monitor/debug/expr.cc
similarity index 100%
rename from nemu/src/monitor/debug/expr.c
rename to nemu/src/monitor/debug/expr.cc
diff --git a/nemu/src/monitor/debug/ui.c b/nemu/src/monitor/debug/ui.cc
similarity index 69%
rename from nemu/src/monitor/debug/ui.c
rename to nemu/src/monitor/debug/ui.cc
index f0415ffaa9c4738cb23c063a7d970b55be122e9d..32f7dada9037b3a4c89b72877042b5f1486ff1ee 100644
--- a/nemu/src/monitor/debug/ui.c
+++ b/nemu/src/monitor/debug/ui.cc
@@ -32,6 +32,14 @@ static int cmd_c(char *args) {
   return 0;
 }
 
+static int cmd_n(char *args) {
+  cpu_exec(1);
+  return 0;
+}
+
+static int cmd_info(char *args);
+static int cmd_x(char *args);
+
 static int cmd_q(char *args) {
   return -1;
 }
@@ -39,12 +47,15 @@ static int cmd_q(char *args) {
 static int cmd_help(char *args);
 
 static struct {
-  char *name;
-  char *description;
+  const char *name;
+  const char *description;
   int (*handler) (char *);
 } cmd_table [] = {
   { "help", "Display informations about all supported commands", cmd_help },
   { "c", "Continue the execution of the program", cmd_c },
+  { "n", "= GDB `n`", cmd_n },
+  { "info", "= GDB `info`, only supporting `info r`", cmd_info },
+  { "x", "x <bytes> <start address>", cmd_x },
   { "q", "Exit NEMU", cmd_q },
 
   /* TODO: Add more commands */
@@ -113,3 +124,30 @@ void ui_mainloop(int is_batch_mode) {
     if (i == NR_CMD) { printf("Unknown command '%s'\n", cmd); }
   }
 }
+
+#include <stdexcept>
+#include <rlib/stdio.hpp>
+using namespace rlib;
+using namespace rlib::literals;
+
+#include <sstream>
+
+auto dumpReg(uint32_t val) {
+  return string("[32b={}{}, L16b={}{}]").format(std::hex, val, (uint16_t)val, std::dec);
+}
+
+static int cmd_info(char *args) {
+  if("r"_rs != args) {
+    println("Error: only 'info r' is supported.");
+    return 1;
+  }
+  println("Registers:");
+  printfln("%eax={}, %ebx={}, %ecx={}, %edx={}", dumpReg(cpu.eax), dumpReg(cpu.ebx), dumpReg(cpu.ecx), dumpReg(cpu.edx));
+  printfln("%esp={}, %ebp={}, %esi={}, %edi={}", dumpReg(cpu.esp), dumpReg(cpu.ebp), dumpReg(cpu.esi), dumpReg(cpu.edi));
+  printfln("%eip={}", dumpReg(cpu.eip));
+  return 0;
+}
+
+static int cmd_x(char *args) {
+  return 0;
+}
\ No newline at end of file
diff --git a/nemu/src/monitor/debug/watchpoint.c b/nemu/src/monitor/debug/watchpoint.cc
similarity index 100%
rename from nemu/src/monitor/debug/watchpoint.c
rename to nemu/src/monitor/debug/watchpoint.cc
diff --git a/nemu/src/monitor/diff-test/diff-test.c b/nemu/src/monitor/diff-test/diff-test.cc
similarity index 78%
rename from nemu/src/monitor/diff-test/diff-test.c
rename to nemu/src/monitor/diff-test/diff-test.cc
index 574678fd4abd196de08ed4cc40b2942e01b59e26..2c290440e513df56d1388e2083dbcef382c4aa2e 100644
--- a/nemu/src/monitor/diff-test/diff-test.c
+++ b/nemu/src/monitor/diff-test/diff-test.cc
@@ -26,19 +26,19 @@ void init_difftest(char *ref_so_file, long img_size) {
   handle = dlopen(ref_so_file, RTLD_LAZY | RTLD_DEEPBIND);
   assert(handle);
 
-  ref_difftest_memcpy_from_dut = dlsym(handle, "difftest_memcpy_from_dut");
+  ref_difftest_memcpy_from_dut = (decltype(ref_difftest_memcpy_from_dut))dlsym(handle, "difftest_memcpy_from_dut");
   assert(ref_difftest_memcpy_from_dut);
 
-  ref_difftest_getregs = dlsym(handle, "difftest_getregs");
+  ref_difftest_getregs = (decltype(ref_difftest_getregs))dlsym(handle, "difftest_getregs");
   assert(ref_difftest_getregs);
 
-  ref_difftest_setregs = dlsym(handle, "difftest_setregs");
+  ref_difftest_setregs = (decltype(ref_difftest_setregs))dlsym(handle, "difftest_setregs");
   assert(ref_difftest_setregs);
 
-  ref_difftest_exec = dlsym(handle, "difftest_exec");
+  ref_difftest_exec = (decltype(ref_difftest_exec))dlsym(handle, "difftest_exec");
   assert(ref_difftest_exec);
 
-  void (*ref_difftest_init)(void) = dlsym(handle, "difftest_init");
+  void (*ref_difftest_init)(void) = (decltype(ref_difftest_init))dlsym(handle, "difftest_init");
   assert(ref_difftest_init);
 
   Log("Differential testing: \33[1;32m%s\33[0m", "ON");
diff --git a/nemu/src/monitor/diff-test/ref.c b/nemu/src/monitor/diff-test/ref.cc
similarity index 100%
rename from nemu/src/monitor/diff-test/ref.c
rename to nemu/src/monitor/diff-test/ref.cc
diff --git a/nemu/src/monitor/monitor.c b/nemu/src/monitor/monitor.cc
similarity index 100%
rename from nemu/src/monitor/monitor.c
rename to nemu/src/monitor/monitor.cc
diff --git a/nemu/tools/gen-expr/gen-expr.c b/nemu/tools/gen-expr/gen-expr.cc
similarity index 100%
rename from nemu/tools/gen-expr/gen-expr.c
rename to nemu/tools/gen-expr/gen-expr.cc
diff --git a/nemu/tools/qemu-diff/src/diff-test.c b/nemu/tools/qemu-diff/src/diff-test.cc
similarity index 100%
rename from nemu/tools/qemu-diff/src/diff-test.c
rename to nemu/tools/qemu-diff/src/diff-test.cc
diff --git a/nemu/tools/qemu-diff/src/gdb-host.c b/nemu/tools/qemu-diff/src/gdb-host.cc
similarity index 100%
rename from nemu/tools/qemu-diff/src/gdb-host.c
rename to nemu/tools/qemu-diff/src/gdb-host.cc
diff --git a/nemu/tools/qemu-diff/src/protocol.c b/nemu/tools/qemu-diff/src/protocol.cc
similarity index 100%
rename from nemu/tools/qemu-diff/src/protocol.c
rename to nemu/tools/qemu-diff/src/protocol.cc