summaryrefslogtreecommitdiff
path: root/PGU/OLD/chapter3/exit.s
blob: 632ebedf91ccb9f9592bb0f65a8cb596f8bc877d (plain)
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
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
# A useless program, which the only thing this shit does is call exit syscall
# The exit status code can be read using

# `echo $?` on shell, which will show the exit status of the last program run.


# %eax holds the system call number
# %ebx holds the return status


# Assembler directives (or pseudo-operations).
#
# Everything starting with a period, is an instruction to the assembler itself.
# They are handled by the assembler program, not actually executed by the
# computer.

# .section command breaks the program down into sections.

# .data section lists any memory storage which will be needed for data
.section .data

# .text section lists the program instructions
.section .text

# Instructs the assembler that _start is "important to remember".
# _start is a symbol, which is going to be replaced by something else either
# during assembly or linking

# Symbols are generally used to mark locations of programs or data, so you can
# refer to them by name instead of by location number

# .globl means that the assembler should not discard this symbol after assembly,
# because the linker will need it.

# _start is a special symbol that always needs to be marked with .globl, because
# it marks the location of the start of the program.

# If the program is not marked this way, when the computer loads the program, it
# won't know where to begin running the program.

.globl _start

# Defines the value of _start label. Label == a symbol followed by a colon.
# Labels defines a symbol's value.

# Labels tell the assembler to make the symbol's value be wherever the next
# instruction or data element will be.

_start:

# different from the book, I'm using x86_64 instructions and its registers, so,
# instead of using %eax and %ebx, I'm using %rax and %rbx directly. The movl
# instruction needed to be changed to movq (move quad) to adapt to the 64-bit
# registers
# mov: (move) 16-bit
# movl: (move long) 32-bit
# movq: (move quad) 64-bit

#ins $(val), (dest) == immediate mode
movq $1, %rax		# Move value 1 into %eax register
			# %eax will hold the syscall number
			# by the linux's calling convention

movq $100, %rbx		# Move value 0 into %ebx register
			# %ebx will hold the exit() syscall
			# argument.

int $0x80		# Interrupt 0x80 will wake up the kernel
			# execute the syscall loaded into %eax