blob: 685076e76bf390c5c3acf862d1b0f61ac3db96ee (
plain) (
blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
|
## 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
|