flat assembler
Message board for the users of flat assembler.

Index > OS Construction > writing text in PMODE doesn't work :(

Author
Thread Post new topic Reply to topic
RedEagle



Joined: 07 Oct 2005
Posts: 8
RedEagle 06 Nov 2005, 11:05
First, my code:
Code:
[Bits 16]

   jmp start ; spring zum anfang des 16Bit kernels

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;   
;; DESKRIPTOREN                            ;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

NULL_Desc: ; Deskriptor auf 0
   dd 0
   dd 0

CODE_Desc: ; Code Deskriptor
; Datensegment: Execute-Read
; Segment present
; Privilegstufe: 0
; 4096 Byte per Unit
; 32-Bit
; Basisadresse: 0
; Segmentgröße: 0xFFFFF
   dw 0xFFFF
   dw 0
   db 0
   db 0x9A
   db 0xCF
   db 0

DATA_Desc: ; Daten Deskriptor
; Datensegment: Read-Write
; Segment present
; Privilegstufe: 0
; 4096 Byte per Unit
; 32-Bit
; Basisadresse: 0
; Segmentgröße: 0xFFFFF
   dw 0xFFFF
   dw 0
   db 0
   db 0x92
   db 0xCF
   db 0

gdt:
   Limit dw 0 ; Größe der GDT (wird später eingetragen)
   Base  dd 0 ; Adresse der GDT (wird später eingetragen)


;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;   
;; Anfang des Codes                        ;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

start:         ; Hier gehts los!

   cli         ; Keine Interrupts bitte!


;; Enable A20 Gate (works!! so I delete it) ;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;   
;; Wechsel in den PMODE                    ;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

   mov eax, cs ; eax auf derzeitige Codesegment setzen
   mov  ds, ax ; ds auf Codesegment setzen
   
   ; Segmentstartadressen Verschieben
   shl eax, 4 
   mov [CODE_Desc+2], ax ; Den 1. Teil der Linearen Adresse eintragen
   mov [DATA_Desc+2], ax
   shr eax, 16
   mov [CODE_Desc+4], al ; Den 2. Teil der Linearen Adresse eintragen
   mov [DATA_Desc+4], al
   
   ; Eintragen der Basisadresse und Limit für die GDT
   mov eax, cs        ; eax auf derzeitige Codesegment setzen
   shl eax, 4
   add eax, NULL_Desc ; Anfang der Deskriptoren

   mov [Base] , eax
   mov [Limit], WORD gdt - NULL_Desc - 1 ; Startoffset vom Offset der GDT Subtraieren
   
   lgdt [gdt] ; GDT Register laden
   
   mov eax, cr0 ; Das CR0 Register in eax laden
   or  eax, 1   ; Das 0. Bit (PE Bit) auf 1 setzen
   mov cr0, eax ; Den neuen Wert in CR0 laden
  
   db 0xEA  ; Bitmuster für ein FAR JUMP
   dw PMODE ; Angabe des Offsets zu dem gesprungen werden soll
   dw 0x8   ; Angabe des Selektors für das Segment zu dem gespr. werden soll


;;;;;;;;;;;;;;;;;;;;;
;  AB HIER 32 BIT  ;;
;;;;;;;;;;;;;;;;;;;;;

[Bits 32]

PMODE:
   
   ; Segmentstartadresse wieder auf 0 setzen
   mov WORD [CODE_Desc+2], 0
   mov WORD [DATA_Desc+2], 0
   mov BYTE [CODE_Desc+4], 0
   mov BYTE [DATA_Desc+4], 0

   ; Selektor für das Datensegment erstellen
   mov eax, 2  ; Index 2 der GTD auswählen (CODE_Desc)
   shl eax, 3  ; Im Selektor beginnt der Index erst ab Bit 3
   mov  ds, ax
   mov  es, ax
   mov  ss, ax
   mov eax, 0
   mov  fs, ax ; FS und GS auf NULL_Desc zeigen lassen
   mov  gs, ax
   mov esp, 0x1FFFFF ; ESP (Stack) auf 2 MB setzen

   jmp 0x8:0x10000 + PMODE2 ; Sprung in das "neue" Codesegment


PMODE2:

   ;print a string
   mov ebx, 1
   mov ecx, 1
   mov esi, msg_REOS
   call printstr ; doesn't work Sad

ENDLESS:
   jmp ENDLESS ; Endlosschleife

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;   
;; Variablen                               ;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

; 1. Byte ist das Attribut
; 1. Byte is the Attribute
msg_REOS db 0x8E,"REOS",0,0


;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;   
;; Funktionen                              ;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; works correct.
;ESI>Test EBX>Spalten ECX>Zeilen
printstr: 
   ; Position berechnen
   imul ecx, 80     ; 80 Zeichen pro Reihe
   add  ebx, ecx    ; und die Aktuelle spalte dazu
   imul ebx, 2      ; mal 2 wegen dem Attr.-byte

   ; VRAM initialisieren
   mov edi, 0xB8000 ; VideoRam
   add edi, ebx     ; Zur gewünschten adresse springen
   ; Farbe laden
   ;inc esi          ; 1. Zeichen holen
   mov dl, [esi]    ; 1. Zeichen laden (Farbcode) in dl

   ; ausgabeschleife
  .char:
   ; Auf abbruch prüfen
   inc esi          ; Zum Nächsten Zeichen gehen
   mov bl, [esi]    ; und in bx laden
   cmp bl, 0        ; ist das Byte = 0 ?
   jz  .done        ; Dann ist jetzt schluss

   ; Zeichen ausgeben
   mov [edi], bl    ; Zeichen ausgeben
   inc edi          ; Weiter im VRAM
   mov [edi], dl    ; Attribut ausgeben
   inc edi          ; Weiter im VRAM
   jmp .char

  .done:
   ret
 
;...    


my Problem:
Code:
mov esi, msg_REOS
call printstr ; GEHT NICHT Sad
;...
msg_REOS db 0x8E,"REOS",0,0    

I put the startaddress of th string in ESI. but this address is not correct, or changes when i call printstr.

Code:
inc esi ; because the first byte ist the color
mov bl, [esi]    

now in BL should be the "R", but it isn't.

Whats wrong??
Post 06 Nov 2005, 11:05
View user's profile Send private message Reply with quote
tom tobias



Joined: 09 Sep 2003
Posts: 1320
Location: usa
tom tobias 06 Nov 2005, 18:10
Quote:

now in BL should be the "R", but it isn't.

Question: I thought the contents of esi was a 32 bit address, i.e. a particular location, which has been assigned the value: "R". I think you seek to read the contents of the address pointed to by esi, rather than reading the address itself, currently occupying esi.
Post 06 Nov 2005, 18:10
View user's profile Send private message Reply with quote
dasyar



Joined: 27 Feb 2005
Posts: 33
dasyar 06 Nov 2005, 18:22
I am assuming that your program is not triple faulting (rebooting)? After glancing at your code, I noticed, getting into pmode their is quite a lot of code. What I normally do is, when I get stuck, is break it down to the fewest lines of code to get into pmode, then once your are in, test it with simple routine like move byte [es: 0xb8000],'A', just to see if you are really where you think you are. Then you can start to rebuild back from a working position. Your code has to many possibilities for error.
Post 06 Nov 2005, 18:22
View user's profile Send private message Reply with quote
RedEagle



Joined: 07 Oct 2005
Posts: 8
RedEagle 06 Nov 2005, 18:28
Yes, I want to "have" the byte, on which the address (ESI) points

bsp.:
[0x8E] <- esi
[R]
[E]
[O]
[S]

- move the first byte to DL
- go to the next byte (ESI+1)
- move this byte to BL
- ...

ps.: I hope this is the right anwer to your question (im not very good in english)

-- EDIT --
Without using ESI it works:
Code:
   ;TEST
   mov bl, 0x23 ; = '#'
   mov dl, 0x0C ; Red
   mov [edi], bl
   inc edi
   mov [edi], dl
    
Post 06 Nov 2005, 18:28
View user's profile Send private message Reply with quote
pradeep



Joined: 04 Nov 2005
Posts: 1
pradeep 06 Nov 2005, 18:55
Are you sure you have setup the desciptors properly. The data segment descriptors base address will be added to the esi register to generate the linear/physical address. in your case base address of Data Segment descriptor should be 0.
Code:
try this:
msg db "Hello World",0
mov esi,msg
mov bl,[esi]    
Post 06 Nov 2005, 18:55
View user's profile Send private message Reply with quote
RedEagle



Joined: 07 Oct 2005
Posts: 8
RedEagle 09 Nov 2005, 14:10
the base address is 0, but i thing, that's the problem !?!?

Code:
   mov esi, msg_REOS
   add esi, 0x10000-1 ; So, it works !!??!!??
   call printstr
    
Post 09 Nov 2005, 14:10
View user's profile Send private message Reply with quote
Display posts from previous:
Post new topic Reply to topic

Jump to:  


< Last Thread | Next Thread >
Forum Rules:
You cannot post new topics in this forum
You cannot reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum
You cannot vote in polls in this forum
You cannot attach files in this forum
You can download files in this forum


Copyright © 1999-2024, Tomasz Grysztar. Also on GitHub, YouTube.

Website powered by rwasa.