83 lines
1.3 KiB
Plaintext
83 lines
1.3 KiB
Plaintext
; x86_64 linux nasm
|
|
|
|
struc Stack
|
|
maxSize: resb 8
|
|
currentSize: resb 8
|
|
contents:
|
|
endStruc
|
|
|
|
section .data
|
|
|
|
soError: db "Stack Overflow Exception", 10
|
|
seError: db "Stack Empty Error", 10
|
|
|
|
|
|
section .text
|
|
|
|
createStack:
|
|
; IN: max number of elements (rdi)
|
|
; OUT: pointer to new stack (rax)
|
|
push rdi
|
|
xor rdx, rdx
|
|
mov rbx, 8
|
|
mul rbx
|
|
mov rcx, rax
|
|
mov rax, 12
|
|
mov rdi, 0
|
|
syscall
|
|
push rax
|
|
mov rdi, rax
|
|
add rdi, rcx
|
|
mov rax, 12
|
|
syscall
|
|
pop rax
|
|
pop rbx
|
|
mov qword [rax + maxSize], rbx
|
|
mov qword [rax + currentSize], 0
|
|
ret
|
|
|
|
|
|
push:
|
|
; IN: stack to operate on (stack argument), element to push (rdi)
|
|
; OUT: void
|
|
mov rax, qword [rsp + 8]
|
|
mov rbx, qword [rax + currentSize]
|
|
cmp rbx, qword [rax + maxSize]
|
|
je stackOverflow
|
|
lea rsi, [rax + contents + 8*rbx]
|
|
mov qword [rsi], rdi
|
|
add qword [rax + currentSize], 1
|
|
ret
|
|
|
|
|
|
pop:
|
|
; pop
|
|
; IN: stack to operate on (stack argument)
|
|
; OUT: element from stack top
|
|
mov rax, qword [rsp + 8]
|
|
mov rbx, qword [rax + currentSize]
|
|
cmp rbx, 0
|
|
je stackEmpty
|
|
sub rbx, 1
|
|
lea rsi, [rax + contents + 8*rbx]
|
|
mov qword [rax + currentSize], rbx
|
|
mov rax, qword [rsi]
|
|
ret
|
|
|
|
|
|
; stack operation exceptions
|
|
stackOverflow:
|
|
mov rsi, soError
|
|
mov rdx, 25
|
|
jmp errExit
|
|
stackEmpty:
|
|
mov rsi, seError
|
|
mov rdx, 18
|
|
errExit:
|
|
mov rax, 1
|
|
mov rdi, 1
|
|
syscall
|
|
mov rax, 60
|
|
mov rdi, 1
|
|
syscall
|