Kein Zugriff auf Register des PM - MASM32



  • Hallo mal wieder,

    nachdem der Versuch eines Bootloaders als .com Datei funktioniert, wollte ich mal versuchsweise in den PM schalten.
    Tabellen hab ich erstellt und Interrupts deaktiviert. Aber schon beim Assemblieren mit ml.exe erhalte ich den Fehler das ein Zugriff auf die PM Register nicht möglich ist.

    Mir ist bewusst das MS das auch nicht unbedingt vorgesehen hat aber mit welchem Format aus MASM kann ich eine Datei mit Registerzugriff erstellen?

    Herr Henkes nutzt FASM um .bin Dateien zu erstellen. Ich habe mich halt sehr an MASM gewöhnt und auch eine recht gute IDE dafür, auf die ich nicht verzichten möchte (WinASM).

    Gibt es eine Möglichkeit (andere Parameter beim Assemblieren oder anderes Format) in MASM oder muss ich für diesen Schritt auf FASM zurückgreifen?

    Gruß, Nicky



  • .686 -> .686p



  • masm schrieb:

    .686 -> .686p

    Na toll..

    Enables assembly of all instructions (including privileged) for the 80486 processor.

    also nur ein "p" dahinter und dann kann meine .com Datei die Tabellen in die Register laden...

    Danke

    Nicky



  • und nochmal ich..

    Der Befehl lgdt [wert] wird bestreikt.
    "Immediate Operand not allowed".
    Operand nicht erlaubt. Wie übergebe ich MASM den richtigen Wert?

    .MODEL tiny
    .CODE 
    .486p
    
    ORG 100h
    start:
    
    push ds
    pop es
    
    xor eax, eax
    xor ebx, ebx
    xor ecx, ecx
    xor edx, edx
    xor esi, esi
    xor edi, edi
    
    cli
    
    LGDT [gdtr]
    mov eax, cr0
    or eax, 01h
    mov cr0, eax
    
    jmp pmode 		;jmp 08h:pmode wird verweigert
    
    pmode:
    mov ax, 0000000000010000b	;Index 2 der GDT nach AX
    mov ds, ax
    mov es, ax
    mov fs, ax
    mov ss, ax
    mov gs, ax
    mov esp, 0A00000h
    
    mov esi, offset string1
    mov edi, 0A000h
    add edi, 160d
    mov ecx, 35d
    
    rep movsb
    
    ;Ende
        mov ax, 4C00h 
        int 21h 
    
    null_eintrag:
    dd 0
    dd 0
    
    code_segment:
    dw 0A00h			;Limit 0-15bit = 2560
    dw 0			;Basis 0-15bit = 0 wir beginnen am Anfang des RAM
    db 0			;Basis 16-23bit
    flag1 db 10010010b	;Typ des Segments
    flag2 db 1100000b
    db 0
    
    daten_segment:
    dw 0A00h			;Limit 0-15bit = 2560
    dw 0			;Basis 0-15bit = 0 wir beginnen am Anfang des RAM
    db 0			;Basis 16-23bit
    flag3 db 10010010b	;Typ des Segments
    flag4 db 1100000b
    db 0
    
    gdtr:
    dw 24d
    dd offset null_eintrag
    
    string1 db "Supernicky ist im Protected Mode...",0
    
    END Start
    

    Nicky



  • Also so schluckt es MASM:

    LGDT fword ptr [gdtr]
    

    Ob Dein Code sinnvoll ist, habe ich nicht überprüft, z.B.: Da MASM weiter im 16-Bit-Modus assembliert, muss auch der PM im 16-Bit-Modus laufen, sonst gibt es unliebsame Überraschungen. Außerdem musst Du Dir sicher sein, dass DS auf gdtr zeigt - vielleicht ist besser:

    LGDT fword ptr [cs:gdtr]
    

    viele grüße
    ralph



  • rkhb schrieb:

    Also so schluckt es MASM:

    LGDT fword ptr [gdtr]
    

    Ob Dein Code sinnvoll ist, habe ich nicht überprüft, z.B.: Da MASM weiter im 16-Bit-Modus assembliert, muss auch der PM im 16-Bit-Modus laufen, sonst gibt es unliebsame Überraschungen. Außerdem musst Du Dir sicher sein, dass DS auf gdtr zeigt - vielleicht ist besser:

    LGDT fword ptr [cs:gdtr]
    

    viele grüße
    ralph

    Die Überraschung ist der interne Prozessorfehler 😕
    Ich habe mir mal NASM geladen und werde mich mal damit beschäftigen. Sieht ja fast gleich aus wie bei MASM.

    Trotzdem Danke

    Nicky



  • START:
    
    	  DB  0EAh                               ; die folgenden Zeilen
    	  DW  (OFFSET PMODE)                     ; erzeugen:
    	  DW  8                                  ; JMP FAR CS:PMODE
    ;---------------------------------------------
     org START + ((($-START)/32)*32)+32           ; Code-Alignment
    ;---------------------------------------------
    PMODE:
    

    Dirk


Log in to reply