1 ## read a character from stdin, save it to a global, write it to stdout
 2 #
 3 # To run:
 4 #   $ subx translate ex4.subx ex4
 5 #   $ subx run ex4
 6 
 7 == code
 8 # instruction                     effective address                                                   operand     displacement    immediate
 9 # op          subop               mod             rm32          base        index         scale       r32
10 # 1-3 bytes   3 bits              2 bits          3 bits        3 bits      3 bits        2 bits      2 bits      0/1/2/4 bytes   0/1/2/4 bytes
11 
12   ## read(stdin, x, 1)
13   # fd = 0 (stdin)
14   bb/copy                                                                                                                         0/imm32           # copy 0 to EBX
15   # initialize x (location to write result to)
16   b9/copy                                                                                                                         x/imm32           # copy to ECX
17   # size = 1 character
18   ba/copy                                                                                                                         1/imm32           # copy 1 to EDX
19   # read(fd, x, size)
20   b8/copy                                                                                                                         3/imm32           # copy 3 to EAX
21   cd/syscall                                                                                                                      0x80/imm8         # int 80h
22 
23   ## write(stdout, x, 1)
24   # fd = 1 (stdout)
25   bb/copy                                                                                                                         1/imm32           # copy 1 to EBX
26   # initialize x (location to read from)
27   b9/copy                                                                                                                         x/imm32           # copy to ECX
28   # size = 1 character
29   ba/copy                                                                                                                         1/imm32           # copy 1 to EDX
30   # write(fd, x, size)
31   b8/copy                                                                                                                         4/imm32           # copy 4 to EAX
32   cd/syscall                                                                                                                      0x80/imm8         # int 80h
33 
34   ## exit(EBX)
35   b8/copy                                                                                                                         1/imm32           # copy 1 to EAX
36   cd/syscall                                                                                                                      0x80/imm8         # int 80h
37 
38 == data
39 x:
40 00 00 00 00  # space for read() to write to
41 
42 # vim:ft=subx:nowrap