# Example showing file syscalls. # # Create a file, open it for writing, write a character to it, close it, open # it for reading, read a character from it, close it, delete it, and return # the character read. # # To run: # $ ./subx translate examples/ex7.subx -o examples/ex7 # $ ./subx run examples/ex7 # Expected result: # $ echo $? # 97 == code 0x09000000 # instruction effective address register displacement immediate # . op subop mod rm32 base index scale r32 # . 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 Entry: # syscall(creat, Filename) bb/copy-to-ebx Filename/imm32 b9/copy-to-ecx 0x180/imm32/fixed-perms b8/copy-to-eax 8/imm32/creat cd/syscall 0x80/imm8 # stream = syscall(open, Filename, O_WRONLY, 0) # we can't use 'fd' because it looks like a hex byte bb/copy-to-ebx Filename/imm32 b9/copy-to-ecx 1/imm32/wronly ba/copy-to-edx 0x180/imm32/fixed-perms b8/copy-to-eax 5/imm32/open cd/syscall 0x80/imm8 # save stream bb/copy-to-ebx Stream/imm32 89/copy 0/mod/indirect 3/rm32/ebx . . . 0/r32/eax . . # copy eax to *ebx # syscall(write, Stream, "a", 1) # . load stream bb/copy-to-ebx Stream/imm32 8b/copy 0/mod/indirect 3/rm32/ebx . . . 3/r32/ebx . . # copy *ebx to ebx # . b9/copy-to-ecx A/imm32 ba/copy-to-edx 1/imm32/size b8/copy-to-eax 4/imm32/write cd/syscall 0x80/imm8 # syscall(close, Stream) # . load stream bb/copy-to-ebx Stream/imm32 8b/copy 0/mod/indirect 3/rm32/ebx . . . 3/r32/ebx . . # copy *ebx to ebx # . b8/copy-to-eax 6/imm32/close cd/syscall 0x80/imm8 # stream = syscall(open, Filename, O_RDONLY, 0) bb/copy-to-ebx Filename/imm32 b9/copy-to-ecx 0/imm32/rdonly ba/copy-to-edx 0x180/imm32/fixed-perms b8/copy-to-eax 5/imm32/open cd/syscall 0x80/imm8 # . save Stream bb/copy-to-ebx Stream/imm32 89/copy 0/mod/indirect 3/rm32/ebx . . . 0/r32/eax . . # copy eax to *ebx # syscall(read, Stream, B, 1) # . load stream bb/copy-to-ebx Stream/imm32 8b/copy 0/mod/indirect 3/rm32/ebx . . . 3/r32/ebx . . # copy *ebx to ebx # . b9/copy-to-ecx B/imm32 ba/copy-to-edx 1/imm32/size b8/copy-to-eax 3/imm32/read cd/syscall 0x80/imm8 # syscall(close, Stream) # . load stream bb/copy-to-ebx Stream/imm32 8b/copy 0/mod/indirect 3/rm32/ebx . . . 3/r32/ebx . . # copy *ebx to ebx # b8/copy-to-eax 6/imm32/close cd/syscall 0x80/imm8 # syscall(unlink, filename) bb/copy-to-ebx Filename/imm32 b8/copy-to-eax 0xa/imm32/unlink cd/syscall 0x80/imm8 # syscall(exit, b) # . load b bb/copy-to-ebx B/imm32 8b/copy 0/mod/indirect 3/rm32/ebx . . . 3/r32/ebx . . # copy *ebx to ebx # b8/copy-to-eax 1/imm32/exit cd/syscall 0x80/imm8 == data 0x0a000000 Stream: 0/imm32 A: 61/imm32/A B: 0/imm32 Filename: 2e 66 6f 6f 00 00 00 00 # . f o o null # . . vim:nowrap:textwidth=0