summaryrefslogtreecommitdiff
path: root/PGU/CHAP9/error.s
blob: 6e933ed3e9216a0eb5097eceeea9ff9a8587ce24 (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
# Error function
#
# Print error messages and exit program.

.include "linux.s"
.equ ST_ERROR_CODE, 16
.equ ST_ERROR_MSG, 24

.globl error_exit
.type error_exit, @function

error_exit:
	pushq %rbp
	movq %rsp, %rbp

	# Write error Code
	movq ST_ERROR_CODE(%rbp), %rcx
	pushq %rcx
	call count_chars
	popq %rcx

	movq %rax, %rdx
	movq %rcx, %rsi
	movq $STDERR, %rdi
	movq $SYS_WRITE, %rax
	syscall

	# Write error message
	movq ST_ERROR_MSG(%rbp), %rcx
	pushq %rcx
	call count_chars
	popq %rcx

	movq %rax, %rdx		# How many bytes to write
	movq %rcx, %rsi		# Buffer to write from
	movq $STDERR, %rdi	# FD to write to
	movq $SYS_WRITE, %rax	# self explanatory
	syscall

	pushq $STDERR
	call write_newline

	# Exit program
	movq $SYS_EXIT, %rax
	movq $1, %rdi
	syscall