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 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81
|
;; Programm who writes 10 times the string "Hello world!\n", prefixed with the iterator number on stdout.
;; compile the source with commands like:
;; $ fasm hello_world.fasm hello_world.exe
format ELF executable 3
entry start
segment readable executable
start: ;; Entry point
;; We initialise datas and jump to writer
mov edi,"0" ; Iterator
align 1 ; We align the code on 1 beacuse the next operation copy bytes in esi.
mov esi, msg_number ; cp byte message in ESI
align 4 ; Restore default alignment ???
jmp writer ; We jump because we won't come back.
main:
;; This is the mainloop ;;
cmp edi,"9" ; compare edi and value "9"
jg returner ; if equal 9 jump to returner.
jle writer ; if littler or equal than 9 jump to writer.
writer: ;;
;; SYSCALL N°4 = write(fd, string, strlen)
;; eax contains the SYSCALL number [4] sea: /usr/include/i386-linux-gnu/asm/unistd_32.h
;; ebx contains the fd arg value.
;; ecx contains the text to write arg value.
;; edx contains the text to write length arg value
mov eax,4
mov ebx,1
mov ecx,esi ; esi contains the numbers bytes sequence.
mov edx,1 ; Print only 1 character.
int 0x80 ; Interrupt SYSCALL
mov eax,4
mov ebx,1
mov ecx,msg
mov edx,msg_size
int 0x80 ; Interrupt SYSCALL
inc edi ; Increment mainloop iterator.
align 1 ; Align on 1 because ESI contains bytes.
inc esi ; Increment number to display
align 4 ; Restore default alignment ???
call main ; No **ret** instruction because we must return to main not to *start* at the first execution.
returner:
;; SYSCALL N°1 = exit(status)
;; eax contains the SYSCALL number [1] sea: /usr/include/i386-linux-gnu/asm/unistd_32.h
;; ebx contains the status arg value.
mov eax,1
mov ebx,0
int 0x80 ; Interrupt SYSCALL
segment readable writeable
msg_number db "0","1","2","3","4","5","6","7","8","9"
msg db ' Hello world!',0xA
msg_size = $-msg |
Partager