I has modified code in http://charles.moostik.net/pmode/ind...?page=Exemple1
to print char in real and protected mode.
Complete code is:
Code: Select all
P386
Descripteur_Segment STRUC
Limite dw ?
Base_0_15 dw ?
Base_16_23 db ?
Flags_1 db ?
Flags_2 db ?
Base_24_31 db ?
Descripteur_Segment ENDS
Donnees SEGMENT USE16
GDT DW GDT_Size
DD offset Descripteur_Nul
toto DW 0
V86 DB "Le processeur est en mode V86.",10,13,"$"
Good DB "Ca a marche !!!",10,13,"$"
Descripteur_Nul Descripteur_Segment <0, 0, 0, 0, 0, 0>
code_16_desc Descripteur_Segment <0FFFFh, 0, 0, 9Ah, 0, 0>
Donnees_16_desc Descripteur_Segment <0FFFFh, 0, 0, 92h, 0, 0>
Pile_16_desc Descripteur_Segment <0FFFFh, 0, 0, 92h, 0, 0>
GDT_Size EQU $ - Offset Descripteur_Nul
Code_16_idx EQU 08h
Donnees_16_idx EQU 10h
Pile_16_idx EQU 18h
Donnees ENDS
Pile SEGMENT STACK USE16
DB 512 DUP (?)
Pile ENDS
Mon_Code SEGMENT USE16
ASSUME CS:Mon_Code, DS:Donnees
Debut :
MOV AX, Donnees
MOV DS, AX
MOV AX, 0003h ; Mode texte
INT 10h
MOV BX, 0B800h
MOV ES, BX
MOV DI, 0
MOV byte ptr ES:[DI], 'A'
INC DI
MOV byte ptr ES:[DI], 02h
MOV EAX, CR0
TEST AL, 1
JZ Ok
; Teste si on se trouve en mode V86
MOV DX, OFFSET V86
MOV AH, 09h
INT 21h
JMP Fin
; On affiche un message et on quite : V86
Ok:
MOV EAX, Mon_Code
SHL EAX, 4
MOV Code_16_Desc.Base_0_15, AX
SHR EAX, 16
MOV Code_16_Desc.Base_16_23, AL
MOV Code_16_Desc.Base_24_31, AH
; Met à jour le selecteur du segment de Code.
MOV EAX, Donnees
SHL EAX, 4
MOV Donnees_16_Desc.Base_0_15, AX
SHR EAX, 16
MOV Donnees_16_Desc.Base_16_23, AL
MOV Donnees_16_Desc.Base_24_31, AH
; Met … jour le selecteur du segment de Données.
MOV EAX, Pile
SHL EAX, 4
MOV Pile_16_Desc.Base_0_15, AX
SHR EAX, 16
MOV Pile_16_Desc.Base_16_23, AL
MOV Pile_16_Desc.Base_24_31, AH
; Met … jour le selecteur du segment de Pile.
MOV EAX, Donnees
SHL EAX, 4
ADD DWORD PTR GDT[2], EAX
; Met … jour la variable GDT
LGDT FWORD PTR GDT
; Charge la GDT
MOV EAX, CR0
OR AL, 1
MOV CR0, EAX
; Commute en PMode
DB 0EAh
DW $+4, Code_16_idx
; Charge un selecteur dans CS...
MOV AX, Donnees_16_idx
MOV DS, AX
; ...dans DS
MOV AX, Pile_16_idx
MOV SS, AX
; ...et dans SS (la pile)
MOV toto, 50
; Ceci est juste un test !
DB 0B8h ; mov eax,0xb8000
DB 00h
DB 80h
DB 0Bh
DB 00h
DB 0C6h ; mov byte [eax],0x42 (B)
DB 00h
DB 42h
DB 0B8h ; mov eax,0xb8001
DB 01h
DB 80h
DB 0Bh
DB 00h
DB 0C6h ; mov byte [eax],0x2 (vert)
DB 00h
DB 02h
MOV EAX, CR0
AND AL, NOT 1
MOV CR0, EAX
; Repasse en PMode
DB 0EAh
DW $+4, Mon_Code
MOV AX, Donnees
MOV DS, AX
MOV AX, Pile
MOV SS, AX
; Recharge des segments
CMP toto, 50
JNE Fin
; On verifie si la variable … bien march‚
;MOV DX, OFFSET Good
;MOV AH, 09h
;INT 21h
Fin:
MOV AX, 4C00h
INT 21h
Mon_Code ENDS
END Debut
Code: Select all
MOV AX, 0003h ; Mode texte
INT 10h
MOV BX, 0B800h
MOV ES, BX
MOV DI, 0
MOV byte ptr ES:[DI], 'A'
INC DI
MOV byte ptr ES:[DI], 02h
But i compile with TASM 16bits, and this compiler don't support [BITS 32] keyword. In protected mode i think i can't write assembleur code because TASM don't generate 32 bits code. I have add directly opcode into protected mode section, see:
Code: Select all
DB 0B8h ; mov eax,0xb8000
DB 00h
DB 80h
DB 0Bh
DB 00h
DB 0C6h ; mov byte [eax],0x42 (B)
DB 00h
DB 42h
DB 0B8h ; mov eax,0xb8001
DB 01h
DB 80h
DB 0Bh
DB 00h
DB 0C6h ; mov byte [eax],0x2 (vert)
DB 00h
DB 02h
Can you help me ?
Thank !!!