In general, one cannot expect eax, ecx, and edx to be preserved across calls to functions in 32-bit code. It's a standard calling convention.
Edit: Try changing je to jna just for shiggles.
changing je to jna doesn't loop, I looked used 16 bit registers (as I haven't even moved into 32 bit yet) however I get the same problem.
If the register doesn't always have a continuous value how would I go about a loop?
Heres the full code:
mov ah, 0x0E ; Teletype output mode
mov bh, 0x00 ; Page number
mov bl, 0x0A ; Grey font
int 0x10 ; Call video interrupt
ret ; Return to the calling procedure
lodsb ; Load a byte from SI to AL and increment SI
cmp al, 0 ; Compare accumulator to 0
je EXIT ; If AL == 0, call the EXIT procedure
call PRINTCHAR ; Else, print the current character on the screen
jmp PRINTSTR ; Jump to PRINTSTR - print the rest of the string
ret ; Just return
Hello DB 'Loading System...', 13, 10, 0
Input DB 'Test'
Before DB '#', 13, 10, 0
times 510 - ($ - $$) DB 0