diff options
author | Kartik Agaram <vc@akkartik.com> | 2018-07-16 22:18:18 -0700 |
---|---|---|
committer | Kartik Agaram <vc@akkartik.com> | 2018-07-16 22:18:18 -0700 |
commit | 6602c82f9f35235b998132f0adc54c852aa4e025 (patch) | |
tree | 8fbb5a3532c7cd279838b15f9149f3d39afda487 /subx/ex5.subx | |
parent | a50a95d21505148035ec8f08af414d663e9dad7e (diff) | |
download | mu-6602c82f9f35235b998132f0adc54c852aa4e025.tar.gz |
4363 - subx: first program using the stack segment
We allocate space for a local variable, read() a character from stdin to it, and write() it out to stdout.
Diffstat (limited to 'subx/ex5.subx')
-rw-r--r-- | subx/ex5.subx | 47 |
1 files changed, 47 insertions, 0 deletions
diff --git a/subx/ex5.subx b/subx/ex5.subx new file mode 100644 index 00000000..f7411939 --- /dev/null +++ b/subx/ex5.subx @@ -0,0 +1,47 @@ +## read a character from stdin, save it to a local on the stack, write it to stdout + +== 0x08048054 # code segment, after leaving room for ELF header and segment headers +# 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 + +## function main + # prolog + 55 # push EBP + 89 e5 # copy ESP to EBP + # ModR/M: 11 (direct mode) 100 (src ESP) 101 (dest EBP) + # allocate x on the stack + 81 ec 4/imm32 # subtract 4 bytes from ESP + # ModR/M: 11 (direct mode) 101 (subtract imm32) 100 (dest EBP) + + ## read(stdin, x, 1) + # fd = 0 (stdin) + bb 0/imm32 # copy 0 to EBX + # set location to read character to + 89 e9 # copy EBP to ECX + # ModR/M: 11 (direct mode) 101 (src EBP) 001 (dest 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 + + ## write(stdout, x, 1) + # fd = 1 (stdout) + bb 1/imm32 # copy 1 to EBX + # set location of character to write out + 89 e9 # copy EBP to ECX + # ModR/M: 11 (direct mode) 101 (src EBP) 001 (dest ECX) + # size = 1 character + ba 1/imm32 # copy 1 to EDX + # syscall = write + b8 4/imm32 # copy 4 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 |