[ORG 0x0000] [BITS 16] %define LOADADDR 0x7C00 %define Bugged_Version %define Functionnal_Version %ifdef Bugged_Version %define laddr(x) (LOADADDR + x) %elifdef Functionnal_Version %define laddr(x) (0x5C00 + x) %endif _start: cli ; disable interrupt xor ax, ax ; clean AX xor bx, bx ; clean BX xor cx, cx ; clean CX xor dx, dx ; clean DX mov ds, ax ; clean DS mov es, ax ; clean ES mov fs, ax ; clean FS mov gs, ax ; clean GS mov si, ax ; clean SI mov di, ax ; clean DI mov ss, ax ; set up stack mov sp, LOADADDR ; SS:SP -> 0x0:0x7C00 mov bp, ax ; clean BP sti cld mov ax, cs call _put_nb mov si, laddr(_lf) call _put call _addr mov si, laddr(_hy_man) call _put mov si, laddr(_lf) call _put _loop: jmp short _loop _addr: push bp mov bp, sp add bp, 2 mov ax, [ss:bp] mov cx, 0x10 call _put_nb mov si, laddr(_lf) call _put pop bp ret _hy_man:db 'Hello World', 0x0 _lf: db 0xA, 0x0 _put: pusha ; don't trust the BIOS .get_cursor: ; mov AH, 0x3 ; Place dans AH le numéro de fonction. ; xor BX, BX ; RAZ de BX qui contient la page d'affichage. ; int 0x10 ; Appele de l'interrupteur 0x10 xor dx, dx xor ax, ax mov al, [0x0462] ; page number mov cx, 2 mul cx add ax, 0x450 ; AX -> cursor position address xchg ax, bx mov dl, [es:bx] ; DL = column mov dh, [es:bx+1] ; DH = row xor bx, bx mov bh, [0x0462] ; page number mov CX, 0X1 ; CX contient le nombre d'affichage de chaque caractère .write_char: lodsb or AL, AL jz short .end cmp AL, 0xA jz short .inc_line pusha mov AH, 0xA int 0x10 popa inc DL .set_cursor: pusha mov AH, 0x2 int 0x10 popa jmp short .write_char .inc_line: inc DH xor DL, DL jmp short .set_cursor .end: popa ; Restauration des registres ret _put_end: _put_nb: ; IN: AX = N ; CX = Base push bp push word 0x0 mov bp, sp sub sp, 32 .div: dec bp xor dx, dx div cx cmp dx, 10 jge short .alpha_digit add dl, 0x30 jmp short .push_digit .alpha_digit: add dl, 0x37 .push_digit: mov byte [ds:bp], dl or ax, ax jz short .print jmp short .div .print: mov si, bp call _put add sp, 34 pop bp ret _put_nb_end: times 0x1FE-($-$$) db 0x00 dw 0xAA55