1 ## read a character from stdin, save it to a global, write it to stdout 2 # 3 # To run (from the subx directory): 4 # $ subx translate examples/ex4.subx -o examples/ex4 5 # $ subx run examples/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 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 to EDX 19 # read(fd, x, size) 20 b8/copy . . . . . . . 3/imm32/read # copy to EAX 21 cd/syscall 0x80/imm8 22 23 # write(stdout, x, 1) 24 # fd = 1 (stdout) 25 bb/copy . . . . . . . 1/imm32 # copy 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 to EDX 30 # write(fd, x, size) 31 b8/copy . . . . . . . 4/imm32/write # copy to EAX 32 cd/syscall 0x80/imm8 33 34 # exit(EBX) 35 b8/copy . . . . . . . 1/imm32/exit # copy 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