38 lines
2.1 KiB
Plaintext
38 lines
2.1 KiB
Plaintext
## print out a (global variable) string to stdout
|
|
#
|
|
# To run:
|
|
# $ subx translate ex6.subx ex6
|
|
# $ subx run ex6
|
|
# Hello, world!
|
|
|
|
== 0x08048074 # code segment, after leaving room for ELF header and segment headers
|
|
# instruction effective address operand 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
|
|
|
|
## write(stdout, x, 1)
|
|
# fd = 1 (stdout)
|
|
bb/copy 1/imm32 # copy 1 to EBX
|
|
# set location to write out
|
|
b9/copy 0x08049097/imm32 # copy to ECX
|
|
# set size
|
|
ba/copy 0x08049093/imm32 # copy to EDX
|
|
8b/copy 0/mod/indirect 2/rm32/edx 2/r32/edx # copy *EDX to EDX
|
|
# syscall = write
|
|
b8/copy 4/imm32 # copy 4 to EAX
|
|
# call
|
|
cd/syscall 0x80/imm8 # int 80h
|
|
|
|
## exit(EBX)
|
|
b8/copy 1/imm32 # copy 1 to EAX
|
|
cd/syscall 0x80/imm8 # int 80h
|
|
|
|
== 0x08049093
|
|
# size of string
|
|
0e 00 00 00
|
|
# string
|
|
48 65 6c 6c 6f 2c 20 77 6f 72 6c 64 21 0a
|
|
# h e l l o , ␣ w o r l d ! newline
|
|
|
|
# vim:ft=subx:nowrap
|