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/read      # copy 3 to EAX
21   cd/syscall  0x80/imm8
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/write     # copy 4 to EAX
32   cd/syscall  0x80/imm8
33 
34   # exit(EBX)
35   b8/copy                                                                                                                         1/imm32/exit      # copy 1 to EAX
36   cd/syscall  0x80/imm8
37 
38 == data
39 x:
40   00 00 00 00  # space for read() to write to
41 
42 # vim:ft=subx:nowrap