about summary refs log tree commit diff stats
path: root/subx
diff options
context:
space:
mode:
authorKartik Agaram <vc@akkartik.com>2018-07-07 23:38:59 -0700
committerKartik Agaram <vc@akkartik.com>2018-07-07 23:38:59 -0700
commitb0f89e4f9b204fa28fc02f6335dbf654d7a4dcf1 (patch)
tree1ea228d87a93e0bfda06792ec9015327f6cc0ed8 /subx
parentc90fa6534ecbdf3e61f19ce2b7cabbc2957ef202 (diff)
downloadmu-b0f89e4f9b204fa28fc02f6335dbf654d7a4dcf1.tar.gz
4326 - new example: read() from stdin
Currently only runs in emulated mode. Likely a paging issue, writing
data to code page. I'm not checking the return value.
Diffstat (limited to 'subx')
-rw-r--r--subx/019syscalls.cc5
-rwxr-xr-xsubx/ex4bin0 -> 113 bytes
-rw-r--r--subx/ex4.subx23
3 files changed, 28 insertions, 0 deletions
diff --git a/subx/019syscalls.cc b/subx/019syscalls.cc
index 96c11ee0..b83b92db 100644
--- a/subx/019syscalls.cc
+++ b/subx/019syscalls.cc
@@ -14,6 +14,11 @@ case 0xcd: {  // int imm8 (software interrupt)
 void process_int80() {
   switch (Reg[EAX].u) {
   case 1:
+    cerr << "result: " << NUM(Mem.at(0x08048000)) << '\n';
     exit(Reg[EBX].u);
+    break;
+  case 3:
+    read(/*file descriptor*/Reg[EBX].u, /*memory buffer*/&Mem.at(Reg[ECX].u), /*size*/Reg[EDX].u);
+    break;
   }
 }
diff --git a/subx/ex4 b/subx/ex4
new file mode 100755
index 00000000..8fd70fbb
--- /dev/null
+++ b/subx/ex4
Binary files differdiff --git a/subx/ex4.subx b/subx/ex4.subx
new file mode 100644
index 00000000..98b9f55a
--- /dev/null
+++ b/subx/ex4.subx
@@ -0,0 +1,23 @@
+## read a character from stdin
+
+# opcode        ModR/M                    SIB                   displacement    immediate
+# instruction   mod, reg, Reg/Mem bits    scale, index, base
+# 1-3 bytes     0/1 byte                  0/1 byte              0/1/2/4 bytes   0/1/2/4 bytes
+# 0: e_entry = 0x08048054
+  ## read(1, x, 1)
+  # fd = 1
+  bb                                                                            1/imm32       # copy 1 to EBX
+  # set location to write to
+  b9                                                                            00 80 04 08   # copy 0x08040000 to ECX
+  # size = 1 character
+  ba                                                                            1/imm32       # copy 1 to EDX
+  # syscall = read
+  b8                                                                            3/imm32       # copy 3 to EAX
+  # call
+  cd                                                                            128/imm8      # int 80h
+
+  ## exit(EBX)
+  b8                                                                            1/imm32       # copy 1 to EAX
+  cd                                                                            128/imm8      # int 80h
+
+# vim:ft=subx:nowrap