69 lines
2.1 KiB
NASM
69 lines
2.1 KiB
NASM
|
;; This is an includes file. It doesn't have its own compilation
|
||
|
;; capabilities. There is no namespacing in assembly language;
|
||
|
;; try not to use these names in your own code.
|
||
|
|
||
|
;; sys/unistd_32.h
|
||
|
%define SYS_write 4
|
||
|
%define SYS_exit 1
|
||
|
|
||
|
;; unistd.h
|
||
|
%define STDOUT 1
|
||
|
|
||
|
;; strlen() function. Takes eax as an argument - the pointer to
|
||
|
;; the initial string. Returns eax as the result - the length of
|
||
|
;; the string.
|
||
|
|
||
|
strlen:
|
||
|
push ebx ; We'll be borrowing this register, so we put its
|
||
|
; current value on the stack.
|
||
|
mov ebx, eax
|
||
|
|
||
|
;; Note that even though these have underscores to indicate that
|
||
|
;; outside users should not use them, they're still globally
|
||
|
;; accesible in this program's namespace. A user could
|
||
|
;; theoretically call _strlen_done from anywhere. Assembly gives
|
||
|
;; you ALL the opportunities to shoot yourself in the foot!
|
||
|
_strlen_next:
|
||
|
cmp byte [eax], 0
|
||
|
jz _strlen_done
|
||
|
inc eax
|
||
|
jmp _strlen_next
|
||
|
|
||
|
_strlen_done:
|
||
|
sub eax, ebx
|
||
|
pop ebx ; Restore the register
|
||
|
ret
|
||
|
|
||
|
;; Puts() function - puts a string to the console. Takes EAX as
|
||
|
;; its only argument - the pointer to the beginning of the string.
|
||
|
|
||
|
puts:
|
||
|
push edx
|
||
|
push ecx
|
||
|
push ebx
|
||
|
push eax
|
||
|
call strlen ; Uses EAX as the pointer to the beginning of the string.
|
||
|
; Returns EAX as the length of the string
|
||
|
|
||
|
mov edx, eax ; Move the length of the string into EDX, where WRITE expects
|
||
|
pop eax ; Restore EAX from the stack
|
||
|
|
||
|
push eax ; Put the value BACK on the stack.
|
||
|
mov ecx, eax ; Put the pointer to the message into ECX, where WRITE expects
|
||
|
mov ebx, STDOUT
|
||
|
mov eax, SYS_write
|
||
|
int 80h
|
||
|
pop eax ; Restore registers in reverse order.
|
||
|
pop ebx
|
||
|
pop ecx
|
||
|
pop edx
|
||
|
ret
|
||
|
|
||
|
;; exit(). Straight from the original.
|
||
|
|
||
|
exit_program:
|
||
|
mov ebx, 0
|
||
|
mov eax, SYS_exit
|
||
|
int 80h
|
||
|
|