LICENSE: BSD 3-Clause "New" or "Revised" License
[libmalice.git] / libmalice.asm
index adb9907d47d9f79ab6fc85fe913fb924a3ff89d6..d8c167be886ef5622dbca831ea10b012515f566a 100644 (file)
@@ -5,14 +5,13 @@
 extern lmMain
 
 section .text ; start of code
-global _lmStart ; export the entry point function
-
 
 
-_lmStart:
+global _lmStart ; export the entry point function
+_lmStart:      ; void lmStart(void)
 mov [__start_esp], esp
 call lmMain
-_start_end:
+.end:
 mov esp, [__start_esp]
        ; Cleanup can be done here if necessary
 mov ebx, eax
@@ -28,7 +27,7 @@ int 0x80
 global lmExit
 lmExit:        ; void lmExit(int exitstatus)
 mov eax, [esp+4]       ; pass the exit status through as eax
-jmp _start_end ; poor man's exception handling
+jmp _lmStart.end       ; poor man's exception handling
        ; ret is not necessary
 
 
@@ -39,21 +38,18 @@ jmp _start_end      ; poor man's exception handling
 
 global lmPrintChar
 lmPrintChar:   ; void lmPrintChar(int chr)
-push eax       ; will be: syscall number
+   ; eax       ; will be: syscall number
 push ebx       ; will be: stdout fd
-push ecx       ; will be: character start address
-push edx       ; will be: character counter
+   ; ecx       ; will be: character start address
+   ; edx       ; will be: character counter
 
 mov  edx, 1    ; print one char
-lea  ecx, [esp+20]     ; address of the char
+lea  ecx, [esp+8]      ; address of the char
 mov  ebx, 1    ; stdout fd
 mov  eax, 4    ; write()
 int 0x80
 
-pop edx
-pop ecx
 pop ebx
-pop eax
 ret
 
 
@@ -64,29 +60,26 @@ ret
 
 global lmPrintString
 lmPrintString: ; void lmPrintString(char *string)
-push eax       ; will be: syscall number
+   ; eax       ; will be: syscall number
 push ebx       ; will be: stdout fd
-push ecx       ; will be: character start address
-push edx       ; will be: character counter
+   ; ecx       ; will be: character start address
+   ; edx       ; will be: character counter
 
 mov  eax, 0            ; prepare for holding a char
-mov  ecx, [esp+20]     ; string start address
+mov  ecx, [esp+8]      ; string start address
 mov  edx, -1           ; init char counter to 0
 
-_print_string_loop:
+.loop:
        inc  edx                ; char_counter++
        mov  al, [ecx+edx]      ; check next char
 cmp al, 0                      ; if != '\0' continue
-jne _print_string_loop
+jne .loop
 
 mov  ebx, 1    ; stdout fd
 mov  eax, 4    ; write()
 int 0x80
 
-pop edx
-pop ecx
 pop ebx
-pop eax
 ret
 
 
@@ -97,11 +90,11 @@ ret
 
 global lmPrintInt32s
 lmPrintInt32s: ; void lmPrintInt(int num)
-push eax       ; will be: dividend
+   ; eax       ; will be: dividend
 push ebx       ; will be: divisor
-push ecx       ; will be: character start address
-push edx       ; will be: character counter
-mov eax, [esp+20]      ; load num
+   ; ecx       ; will be: character start address
+   ; edx       ; will be: character counter
+mov eax, [esp+8]       ; load num
 sub esp, 12            ; make space for converted integer
 lea ecx, [esp+11]      ; string offset counter, start at lastchar+1
                        ; so writing ends at 10 and char 11 is reserved
@@ -109,24 +102,24 @@ lea ecx, [esp+11] ; string offset counter, start at lastchar+1
 mov ebx, 10            ; always divide by 10
 
 cmp eax, dword 0       ; if the number is negative, negate
-jge _print_int_loop
+jge .loop
 neg eax                        ; great fun at -2147483648. Overflow ftw!
 
-_print_int_loop:
+.loop:
        mov edx, 0
        idiv ebx
        add edx, 0x30
        dec ecx         ; write next char
        mov [ecx], dl
 test eax, eax
-jne _print_int_loop
+jne .loop
 
-cmp [esp+32], dword 0  ; check for negative number
-jge _print_int_end     ; skip for positive
+cmp [esp+20], dword 0  ; check for negative number
+jge .end               ; skip for positive
 dec ecx
 mov [ecx], byte '-'    ; add - sign
 
-_print_int_end:
+.end:
 lea edx, [esp+11]
 sub edx, ecx   ; number of chars
 mov  ebx, 1    ; stdout fd
@@ -134,10 +127,7 @@ mov  eax, 4        ; write()
 int 0x80       ; let the number speak
 
 add esp, 12
-pop edx
-pop ecx
 pop ebx
-pop eax
 ret
 
 
@@ -149,8 +139,6 @@ ret
 global lmReadChar
 lmReadChar:    ; int lmReadChar(void)
 push ebx
-push ecx
-push edx
 
 sub esp, 4     ; make room for character to be read
 
@@ -161,19 +149,17 @@ mov eax, 3        ; read()
 int 0x80
 
 cmp eax, 0
-jne _read_char_ok      ; No end of input -> return char
+jne .ok                ; No end of input -> return char
 
-mov eax, 0             ; End of Input -> return 0
-jmp _read_char_end
+mov eax, 0     ; End of Input -> return 0
+jmp .end
 
-_read_char_ok:
+.ok:
 mov eax, 0
 mov al, [esp]
 
-_read_char_end:
+.end:
 add esp, 4
-pop edx
-pop ecx
 pop ebx
 ret
 
@@ -187,8 +173,6 @@ ret
 global lmReadInt32s
 lmReadInt32s:  ; int lmReadInt(void)
 push ebx
-push ecx
-push edx
 push esi       ; negative number info
 push edi       ; actual number
 
@@ -198,7 +182,7 @@ mov esi, 0  ; 0 = positive
 mov edi, 0     ; start with 0
 
 
-_read_int_next:
+.next:
 mov edx, 1     ; number of chars
 mov ecx, esp   ; character buffer
 mov ebx, 0     ; stdin fd
@@ -206,38 +190,38 @@ mov eax, 3        ; read()
 int 0x80
 
 cmp eax, 0
-je _read_int_neg       ; End of input
+je .neg                ; End of input
 
 mov eax, 0
 mov al, [esp]
 
 cmp al, '-'
-jne _read_int_process_digit
+jne .process_digit
 mov esi, 1
-jmp _read_int_next
+jmp .next
 
-_read_int_process_digit:
+.process_digit:
 cmp al, 0x30
-jb _read_int_neg       ; char < '0'
+jb .neg                ; char < '0'
 cmp al, 0x39
-ja _read_int_neg       ; char > '9'
+ja .neg                ; char > '9'
 
 sub eax, 0x30
 imul edi, 10   ; shift old digits
 add edi, eax   ; add new digit
 
-jmp _read_int_next
+jmp .next
 
 
-_read_int_neg:
+.neg:
 test esi, esi
-jz _read_int_skip_loop
+jz .skip_loop
 neg edi
 
 
-_read_int_skip_loop:   ; read and skip until newline is encountered
+.skip_loop:    ; read and skip until newline is encountered
 cmp byte [esp], 0x0a
-je _read_int_end       ; if newline found -> end reading
+je .end                ; if newline found -> end reading
 
 mov edx, 1     ; number of chars
 mov ecx, esp   ; character buffer
@@ -246,19 +230,17 @@ mov eax, 3        ; read()
 int 0x80
 
 cmp eax, 0
-je _read_int_end       ; End of input -> end reading
+je .end                ; End of input -> end reading
 
-jmp _read_int_skip_loop
+jmp .skip_loop
 
 
-_read_int_end:
+.end:
 mov eax, edi   ; Return value: The number read
 
 add esp, 4
 pop edi
 pop esi
-pop edx
-pop ecx
 pop ebx
 ret