# HG changeset patch # User Markus Bröker # Date 1508705727 -7200 # Node ID 43ae72f88d0636351bf04d92be75d3515dab1e09 # Parent c6e0af68825a6879a23aa169a1cb3f4d3063ffc1 2er Komplement und integerToString diff --git a/osx/Makefile b/osx/Makefile --- a/osx/Makefile +++ b/osx/Makefile @@ -9,7 +9,7 @@ TARGETS+= helloC OBJECTS = hello.o main.o -ENTRYPOINT = _entryPoint +ENTRYPOINT = start .SUFFIXES: .c .asm diff --git a/osx/hello.asm b/osx/hello.asm --- a/osx/hello.asm +++ b/osx/hello.asm @@ -1,32 +1,149 @@ +;; +;; hello.asm +;; Basics in Assembler +;; +global start global _entryPoint %define SYSCALL_EXIT 0x1 %define SYSCALL_WRITE 0x4 +%define SYS_INTERRUPT 0x80 section .data - msg db "Hello World!", 0x0a ; Die Nachricht - len equ $-msg + msg db "ASM Tutorial for 32 Bit Intel!", 10, 0 + len equ $-msg + + buffer: times 100 db '.' + quotient: dd 10 section .text -call _entryPoint -jmp asm_exit +start: + call _entryPoint + mov eax, 1000 + mov ebx, -1024 + call calculate + + mov eax, 1000 + mov ebx, 1024 + call calculate + + call asm_exit + ret + +asm_exit: + push DWORD 0 + mov eax, SYSCALL_EXIT + int SYS_INTERRUPT + ret + +asm_write: + mov eax, SYSCALL_WRITE + int SYS_INTERRUPT + ret + +;; +;; CL: NEGATIVE BIT - BOOLEAN +;; EAX: NUMBER TO CONVERT +;; EBX: counter +;; +integerToString: + xor cl, cl + + mov ebx, 0 + lea si, [buffer] + mov di, si + + cmp eax, 0 + jg loop + + ;; SET NEGATIVE + mov cl, 1 + + ;; reverse internal negative representation + not eax + inc eax + + loop: + xor edx, edx + idiv DWORD [quotient] + add edx, 30h + mov [si], edx + inc si + inc ebx + + cmp eax, 0 + jne loop + + ;; Save current string position + push si + + ;; ADD +/- SIGN + cmp cl, 0 + jz positive + jg negative + + positive: + mov BYTE [si], '+' + jmp reverse + + negative: + mov BYTE [si], '-' + jmp reverse + + ;; Reverse the number in human readable format + reverse: + ;; swap first with last and so on + mov al, BYTE [si] + mov ah, BYTE [di] + mov BYTE [si], ah + mov BYTE [di], al + + dec si + inc di + + ;; 1 2 3 4 5 6 + ;; 6 1 + ;; 5 2 + ;; 4 3 + ;; + cmp si, di + jg reverse + + ;; Restore current String position + pop di + + ;; add newline and string terminator + newline: + mov BYTE [di], 10 + inc di + mov BYTE [di], 0 + inc di + + ;; add the two chars to the counter + add ebx, 2 + + ret + +calculate: + imul ebx + call integerToString + + push DWORD ebx + push DWORD buffer + push DWORD 1 + + call asm_write + + add esp, 12 + ret _entryPoint: - push dword len ;; Länge des Texts - push dword msg ;; Der Text - push dword 1 ;; stdout - - ;; call write - mov eax, SYSCALL_WRITE - sub esp, 4 - int 0x80 + push DWORD len ;; Text Len + push DWORD msg ;; Pointer to String + push DWORD 1 ;; stdout - ;; clean up 3 pushes - add esp, 16 - -asm_exit: - push dword 0 - mov eax, SYSCALL_EXIT - sub esp, 4 - int 0x80 + call asm_write ;; + + add esp, 12 ;; cleanup stack + ret diff --git a/osx/main.c b/osx/main.c --- a/osx/main.c +++ b/osx/main.c @@ -1,10 +1,9 @@ #include #include -void entryPoint(); +void entryPoint(); -int -main(int argc, char **argv) +int main(int argc, char **argv) { printf("Assembler Tutorial reloaded!\n");