Page 1 of 1

Can't Show Text in Operational System

Posted: Sat Aug 22, 2009 7:58 pm
by Nathan
Hello,
I'm trying to do an OS that shows a message(msg1 = Hello, World) for the user, but when the OS boots up on Bochs, it don't shows nothing than the boot process. Here is my code:

Code: Select all

[BITS 16]	 ; 16 bit code generation
[ORG 0x7C00]	 ; ORGin location is 7C00

main:
MOV AH, 0Eh
MOV BH, 00h
MOV BL, 07h
MOV AL, 1
MOV BP, msg1
MOV AH, 13h
INT 10h
JMP msg1                                    

msg1 DB "Hello, World!"

; Boot things
times 510-($-$$) db 0	; Fill the rest of the sector with zeros
dw 0xAA55		; Boot signature
But when i boot up it with Bochs it only shows me nothing.
I compiled and write at the floppy correct.

Thanks,
Nathan Paulino Campos

Re: Can't Show Text in Operational System

Posted: Sat Aug 22, 2009 8:17 pm
by gravaera
So: how does this Operational System stuff work? *snicker snicker* 8) (Couldn't resist)

Hi: First result in google for "Bios int 10h" = wikipedia, which states that you are using the wrong BIOS interrupt subfunction.
Wikipedia wrote: AH = 13h : Output a string.

AL = Write mode, BH = Page, BL = Color, CX = String length, DH = Row, DL = Column, ES:BP = Offset of string
Wikipedia wrote: AH = 0Eh : Output a character

AL = Character
According to the listed expected values, you would get nothing, since you're calling a function to print one char, and the char you set is null, or garbage, depending on what was left over in your AL reg. That was easily debuggable... [-X

Re: Can't Show Text in Operational System

Posted: Sat Aug 22, 2009 8:26 pm
by Nathan
Ok, now a part is fixed, but how i can put the "Hello, World" printed in the screen.
I'm reading this.

Thanks!

Re: Can't Show Text in Operational System

Posted: Sat Aug 22, 2009 9:13 pm
by neon
I see you are already able to display a single character. To display a string, just loop it until a string-terminating character (usually 0 but can be anything.)

Quick example function:

Code: Select all

; Prints a string DS=>SI: 0 terminated string
Print:
			lodsb
			or	al, al
			jz	.done
			mov	ah, 0eh
			int	10h
			jmp	Print
	.done
			ret
Just put the address of a null-terminating string in DS:SI and call the function to print a string.

Also, your boot loader should crash. You have a JMP msg1 instruction that will cause the processor to execute your string as machine instructions.

Re: Can't Show Text in Operational System

Posted: Sun Aug 23, 2009 6:52 am
by Nathan
Hello neon,
DS : SI?, like this:

Code: Select all

MOV DS, SI
MOV BP, msg1

msg1 DB "Hello, World!"
Thanks,
Nathan Paulino Campos

Re: Can't Show Text in Operational System

Posted: Sun Aug 23, 2009 11:17 am
by Andr3w
Nathan wrote: Hello neon,
DS : SI?, like this:

Code: Select all

MOV DS, SI
MOV BP, msg1

msg1 DB "Hello, World!"
Use neon's function to display a string.

Code: Select all


mov [ds:si], msg1
call Print
jmp $

msg1 db "hello, world!", 0     ; null-terminate our string

Hope this helps!

--Andrew

Re: Can't Show Text in Operational System

Posted: Sun Aug 23, 2009 11:23 am
by Nathan
Hello Andrew,
Thanks for this, but see my code now, it's working:

Code: Select all

[BITS 16]	 ; 16 bit code generation
[ORG 0x7C00]	 ; ORGin location is 7C00

main:
MOV BH, 00h
MOV BL, 07h
MOV AL, 1
MOV BH, 0
MOV BL, 0011_1011b
MOV CX, osmsgend - os_msg ; calculate message size. 
MOV DL, 30
MOV DH, 0
PUSH CS
POP ES
MOV BP, os_msg
MOV AH, 13h
INT 10h
JMP wel

wel:
MOV BH, 00h
MOV BL, 07h
MOV AL, 1
MOV BH, 0
MOV BL, 0011_1011b 
MOV CX, welcome_end - welcome ; calculate message size. 
MOV DL, 32
MOV DH, 2
PUSH CS
POP ES
MOV BP, welcome
MOV AH, 13h
INT 10h
JMP osmsgend
                         
welcome DB "Welcome !"
welcome_end:
                         
os_msg DB "BerlOS v0.0.1"
osmsgend:
JMP $
; Boot things
TIMES 510-($-$$) DB 0	; Fill the rest of the sector with zeros
DW 0xAA55		; Boot signature
Thanks,
Nathan Paulino Campos

Re: Can't Show Text in Operational System

Posted: Sun Aug 23, 2009 11:32 am
by Andr3w
I checked and tried your code.
You should place BIOS Parameters Block at the top of your code, like this:

Code: Select all

[BITS 16]    ; 16 bit code generation
[ORG 0x7C00]    ; ORGin location is 7C00

	jmp short main	; Jump past disk description section
	nop				; Pad out before disk description


; ------------------------------------------------------------------
; Disk description table, to make it a valid floppy
; Note: some of these values are hard-coded in the source!
; Values are those used by IBM for 1.44 MB, 3.5" diskette

OEMLabel		db "BERL OS "	; Disk label - 8 chars
BytesPerSector		dw 512		; Bytes per sector
SectorsPerCluster	db 1		; Sectors per cluster
ReservedForBoot		dw 1		; Reserved sectors for boot record
NumberOfFats		db 2		; Number of copies of the FAT
RootDirEntries		dw 224		; Number of entries in root dir
					; (224 * 32 = 7168 = 14 sectors to read)
LogicalSectors		dw 2880		; Number of logical sectors
MediumByte		db 0F0h		; Medium descriptor byte
SectorsPerFat		dw 9		; Sectors per FAT
SectorsPerTrack		dw 18		; Sectors per track (36/cylinder)
Sides			dw 2		; Number of sides/heads
HiddenSectors		dd 0		; Number of hidden sectors
LargeSectors		dd 0		; Number of LBA sectors
DriveNo			dw 0		; Drive No: 0
Signature		db 41		; Drive signature: 41 for floppy
VolumeID		dd 00000000h	; Volume ID: any number
VolumeLabel		db "BERL OS    "; Volume Label: any 11 chars
FileSystem		db "FAT12   "	; File system type: don't change!


main:
MOV BH, 00h
MOV BL, 07h
MOV AL, 1
MOV BH, 0
MOV BL, 0011_1011b
MOV CX, osmsgend - os_msg ; calculate message size.
MOV DL, 30
MOV DH, 0
PUSH CS
POP ES
MOV BP, os_msg
MOV AH, 13h
INT 10h
JMP wel

wel:
MOV BH, 00h
MOV BL, 07h
MOV AL, 1
MOV BH, 0
MOV BL, 0011_1011b
MOV CX, welcome_end - welcome ; calculate message size.
MOV DL, 32
MOV DH, 2
PUSH CS
POP ES
MOV BP, welcome
MOV AH, 13h
INT 10h
JMP osmsgend
                         
welcome DB "Welcome !"
welcome_end:
                         
os_msg DB "BerlOS v0.0.1"
osmsgend:
JMP $
; Boot things
TIMES 510-($-$$) DB 0   ; Fill the rest of the sector with zeros
DW 0xAA55      ; Boot signature

Re: Can't Show Text in Operational System

Posted: Sun Aug 23, 2009 11:39 am
by Nathan
Hello Andrew,
Thanks for the very good help, but what those things do of difference in my OS, i know about BIOS, but why i have to declare this all?

Thanks,
Nathan Paulino Campos

Re: Can't Show Text in Operational System

Posted: Sun Aug 23, 2009 11:42 am
by Andr3w
Nathan wrote:Hello Andrew,
Thanks for the very good help, but what those things do of difference in my OS, i know about BIOS, but why i have to declare this all?
EDIT: You need BPB (BIOS Parameters Block) if your file system requires it.
FAT12 needs this BPB.


Best regards,
-- Andrew

Re: Can't Show Text in Operational System

Posted: Sun Aug 23, 2009 11:46 am
by Nathan
Hum, thanks i'm going to see!

Re: Can't Show Text in Operational System

Posted: Sun Aug 23, 2009 11:52 am
by neon
Hello,
Nathan wrote:Hello neon,
DS : SI?, like this:

Code: Select all

MOV DS, SI
MOV BP, msg1

msg1 DB "Hello, World!"
Learn about segments and the segment:offset addressing that is used in real mode.

The above code will not work. DS is the data segment register (do to your ORG statement, this should be 0) and SI is the offset to your string.

Also, you only need the Bios Parameter Block (BPB) if the filesystem you plan to use (if any) requires it.

Re: Can't Show Text in Operational System

Posted: Sun Aug 23, 2009 1:53 pm
by Nathan
Thanks neon!