Page 2 of 2
Re:How to print a message in protected mode
Posted: Sun Sep 22, 2002 2:07 pm
by Slasher
Include the rest of the code cause can't see any problems here. could be that you didn't initialize your esi pointer properly or that the data segment is not pointing to the right place
so until we can see that there is little we can do
Re:How to print a message in protected mode
Posted: Sun Sep 22, 2002 2:13 pm
by beyondsociety
[attachment deleted by admin]
Re:How to print a message in protected mode
Posted: Sun Sep 22, 2002 2:50 pm
by Tom
your IDT reboots my computer when sti is executed
Re:How to print a message in protected mode
Posted: Sun Sep 22, 2002 2:59 pm
by beyondsociety
Thats wierd, it works fine on mine
Re:How to print a message in protected mode
Posted: Sun Sep 22, 2002 3:08 pm
by Slasher
okay,
first of all set your DS to 7C0h (so when hardware does DS*16, it gets 7C00h, just like CS where boot sector is loaded) cause DS is supposed to be the same as CS in boot sector!
try that and get back to us, waiting.. ;D
Re:How to print a message in protected mode
Posted: Sun Sep 22, 2002 3:22 pm
by beyondsociety
I have set ds to 7c0h. I originally had zero as my offset for my bootsecter so I am able to get into pmode.
Since I have changed the offset to 7c0h, where are the places in my bootsector that I will have to add that offset to.
I lost on this.
ex: gdt + 7c0h
The code is above, boot_os.asm
Re:How to print a message in protected mode
Posted: Sun Sep 22, 2002 3:28 pm
by Slasher
You don't need to add any offset to anything in the bootcode cause it will be loaded at 7C00h to 7C00h+512bytes.Have you mad that change and tested it yet? also which printing is failing, is it switching to protected mode or hello from protected mode?
also check that you terminated the protected mode string properly.
Re:How to print a message in protected mode
Posted: Sun Sep 22, 2002 3:42 pm
by beyondsociety
Originally my bootsector is set up like this:
[org 07c00h]
xor ax,ax
mov ds,ax
I changed it to this and ran it. It rebooted my computer without even displaying a message.
[org 0]
mov ax,7c0h
mov ds,ax
The hello from protected mode message is whats giving me the trouble.
Should the PE bit be set to 1 like this:
or al,1 or should it be or eax,1?
Re:How to print a message in protected mode
Posted: Tue Sep 24, 2002 10:31 am
by Slasher
okay,
change that
mov ax,7c0h
back to what it was earlier.
2. or al,1 and or eax,1 is the same but
or eax,1
should be used to insure that the original value CR0 in eax stays the same after the or cause the
or al,1
could loss a bit which would have moved into ah if
or eax,1
was used. so use
or eax,1(which is also the same as inc eax)
Try this print funtion instead
offset=(cur_x*2+cur_y*160)
mov edi,b8000h
mov esi,message_1 (same as lea esi,[message_1] )
call print_string_32
print_string_32:
.print_char:
mov al,[esi]
cmp al,0
je .exit_print
add edi,offset
mov [edi],al
inc edi
mov [edi],attribute
inc edi
inc esi
jmp print_char
.exit_print
ret
Re:How to print a message in protected mode
Posted: Tue Sep 24, 2002 11:59 am
by beyondsociety
Whats the offset and attribute. Nasm complains about it. Is there supposed to be some value for them?
Re:How to print a message in protected mode
Posted: Tue Sep 24, 2002 1:09 pm
by Slasher
i just used offest and attribute as place holders, you are to create them
in nasm
in your data segment
cur_x db 0
cur_y db 0
attribute db 0
then write
print_string_32:
push eax
xor eax,eax
mov ax,byte [cur_y]
mov bx,80
mul bx
add ax,[cur_x]
shl ax,1 ;ax=offfset=(cur_y*80+cur_x)* 2=cur_y*160+cur_x*2
add edi,eax
.print_char:
mov al,[esi]
cmp al,0
je .exit_print
mov [edi],al
inc edi
mov [edi],byte [attribute]
inc edi
inc esi
jmp print_char
.exit_print
ret
so before calling this print function
set cur_x to desired x position (0 to 79 inclusive)
set cur_y to desired y position (0 to 24 inclusive)
set attribute to desired value eg 0x07 white on black no blincking
(check
http://www.mega-tokyo.com/forum/index.p ... eadid=1516 for more details on this)
set EDI to b8000h (mov edi,b8000h)
set ESI to address of string to print (mov esi,mess_1)
then call print_string_32
this should work,try it!!! ;D
Re:How to print a message in protected mode
Posted: Tue Sep 24, 2002 5:01 pm
by beyondsociety
Nasm doesn't like the:
mov ax,byte [cur_y]
and the:
mov [edi], byte [attribute]
Why is this so? How do I fix this problem?
Re:How to print a message in protected mode
Posted: Wed Sep 25, 2002 12:26 am
by Pype.Clicker
you're trying to load a 16-bits word with a 8-bits value ... i suggest you use
Code: Select all
mov ax, byte 0 ;; zeroes ax, but with a 1-byte encoded constant.
;; the cpu knows how to extend the constant.
;; this is just to save 1 byte of code
mov al, byte [...] ;; and now load the lower part of it
note that you can skip the mov ax, 0 stuff as you already have a xor eax, eax (note also that imho, mov eax, byte 0 is the same size and usually pairs better in the complex pipe-line of modern cpus
you can save the cycles needed in byte/dword conversion (xor eax, eax) by allocating a dd to your variables ...
Code: Select all
mov [edi],al
inc edi
mov [edi], byte [attr]
you cannot have 2 memory operands in a single command.
Code: Select all
mov ah, byte [attr]
mov [edi], ax
add edi, byte 2
i also suggest you avoid the 16-bits computations as much as you can while in 32 bits mode (mul bx should rather be imul eax, ebx)
for speed reasons.
your last lines
Code: Select all
shl ax,1 ;ax=offfset=(cur_y*80+cur_x)* 2=cur_y*160+cur_x*2
add edi,eax
can be simplified into
finally, you can avoid the multiplication every call to print32 if you store the
line offset (curr_y*80) rather than just curr_y.
This just means that you'll have to compute y*80 when you perform a goto_xy, but it will surely speed up your computation as you should have more prints than gotoxy
Another trick is to compute curr_y*80 as curr_y*64+curr_y*16
Code: Select all
mov eax, [curr_y]
mov ebx,eax
shl eax, 6
lea ebx,[ebx*4] ;; no shift here because there's no shift unit in V
add edi,[curr_x]
lea eax,[eax+ebx*4]
nop ;; there will be a stall state here. if you have something else
to do ...
add edi, eax
Re:How to print a message in protected mode
Posted: Wed Sep 25, 2002 6:09 pm
by beyondsociety
I really dont understand what you are trying to accomplish. Could you re-write the print function with the modified suggestions?
Re:How to print a message in protected mode
Posted: Thu Sep 26, 2002 12:36 am
by Pype.Clicker
beyondsociety wrote:
I really dont understand what you are trying to accomplish. Could you re-write the print function with the modified suggestions?
i could, but i wont... what i tried to do is to give you clues on what you could improve in the code. If this seems too complicated, just get the changes about the lines nasm dislikes (and, if i can afford a suggestion, read a book about ASM programming if you plan to do your OS in asm).
It's pointless to give you a "packaged & optimized" version of the function before you can understand *what* has been optimized and *why* ...
that's my point of vue, at least.