Op deze website gebruiken we cookies om content en advertenties te personaliseren, om functies voor social media te bieden en om ons websiteverkeer te analyseren. Ook delen we informatie over uw gebruik van onze site met onze partners voor social media, adverteren en analyse. Deze partners kunnen deze gegevens combineren met andere informatie die u aan ze heeft verstrekt of die ze hebben verzameld op basis van uw gebruik van hun services. Meer informatie.

Akkoord

Vraag & Antwoord

Programmeren

[Masm] Het jumpen wil niet zo goed lukken

DarkScribe
7 antwoorden
  • Ben bezig met een bootloader en na de eerste start wordt er een bestand geladen op een adres ES:BX. Hoewel Nasm prima werkt wil ik graag Masm gebruiken. De huidige jump instructie is

    JMP DWORD PTR ES:00000h

    Dit is ook het adres waar ik het image van het volgende bestandje laat starten. Toch blijft hij op de JMP instructie steken. Doe ik iets fout? (zal haast wel) :grin:

    p.s. Compileren gaat prima, dat is niet het probleem. Met Nasm gaat het wel en dat irriteert mij behoorlijk.
    _________________
    I'm not a complete idiot, some parts are missing.

    [ Dit Bericht is bewerkt door: DarkScribe op 2002-03-16 09:36 ]
  • tis lang geleden dat ik iets met assembly heb gedaan, maar moet het niet:

    JMP DWORD PTR [ES:0h]

    zijn? (zo van indirect)
  • Heb ik ook al geprobeerd, maar het effect blijft hetzelfde. Alle documentatie van Masm geeft geen soelaas, en zoals het er nu uitziet denk ik dat ik verder moet met Nasm. Zonde van het geld dat ik toen voor Masm betaald heb. In ieder geval bedankt.
  • Kun je niet van de code die nasm genereerd een disassemble doen (met debug ofzo) en kijken wat voor jump nasm genereerd en deze in masm proberen te krijgen?
  • Er zit inderdaad verschil tussen de output van beide programma's. De output van Nasm is
    [code:1:dec0b0a8f5]AX=0004 BX=0000 CX=0002 DX=0000 SP=FFFE BP=0000 SI=0000 DI=0000
    DS=078C ES=1000 SS=078C CS=078C IP=0118 NV UP EI PL ZR NA PE NC
    078C:0118 EA00000010 JMP 1000:0000[/code:1:dec0b0a8f5]
    en de output van Masm is
    [code:1:dec0b0a8f5]AX=0004 BX=0000 CX=0002 DX=0000 SP=FFFE BP=0000 SI=0000 DI=0000
    DS=078C ES=1000 SS=078C CS=078C IP=0118 NV UP EI PL ZR NA PE NC
    078C:0118 26 ES:
    078C:0119 FF2E0000 JMP FAR [0000] ES:0000=1F0E[/code:1:dec0b0a8f5]
    Ik heb gecontroleerd wat op ES:0h staat en in beide gevallen bevindt zich daar de code van het bestand dat ik daar plaats. Zoals ik het zie zou de code moeten werken maar toch…

    Let overigens niet op de IP want ik heb alle code weggehaald die niet van belang is, daarom is de IP zo laag. De code voor Nasm ziet er zo uit:[code:1:dec0b0a8f5][ORG 0x7C00]
    [BITS 16]

    JMP start ; Jump over BIOS parameter block
    start:
    MOV AH,002h ; Function for disk access
    MOV AL,004h ; Amount of sectors to read
    MOV CH,000h ; Track
    MOV CL,002h ; sector
    MOV DH,000h ; head
    MOV DL,000h ; drive
    MOV BX,01000h ; Create a buffer at 4096
    MOV ES,BX
    MOV BX,00000h ; point to start of buffer
    INT 13h
    ; Jump code werkt hier wel
    JMP 0x1000:0x0000 ; transfer control


    ; Hier komt het DATA gedeelte[/code:1:dec0b0a8f5]
    en de code voor Masm[code:1:dec0b0a8f5]_TEXT SEGMENT WORD PUBLIC 'CODE'
    ASSUME CS:_TEXT, DS:_TEXT
    ORG 07C00h

    first:
    JMP start

    ; Hier komt dan het DATA gedeelte

    start:
    MOV AH,002h ; Function for disk access
    MOV AL,004h ; Amount of sectors to read
    MOV CH,000h ; Track
    MOV CL,002h ; sector
    MOV DH,000h ; head
    MOV DL,000h ; drive
    MOV BX,01000h ; Create a buffer at 4096
    MOV ES,BX
    MOV BX,00000h ; point to start of buffer
    INT 13h
    ; Jump code werkt hier niet
    JMP DWORD PTR ES:00000h ; transfer control

    _TEXT ENDS

    END first[/code:1:dec0b0a8f5]

    [edit]
    Wat overigens wel lukt is wanneer ik de code van het bestand aanpas met debug zodat de JMP FAR verdwijnt en er EA00000010 voor in de plaats zet. Maar een bestand door Masm gemaakt moet ik niet hoeven patchen :sad:
    [/edit]

    _________________
    I'm not a complete idiot, some parts are missing.

    [ Dit Bericht is bewerkt door: DarkScribe op 2002-03-17 20:07 ]
  • Ik zie dat je in de nasm versie een vaste JMP FAR doet naar 1000h:0, maar bij masm stop je het adres eerst in es:bx. Waarom zet je in masm niet ook een jmp far 1000h:0 neer?
  • Omdat Masm met 1 van de volgende foutmeldingen komt, al naargelang de constructies die ik toepas.

    error A2096: segment, group or segment register expected
    error A2206: missing operator in expression
    error A2031: must be index or base register

    Dit zelfde effect krijg je ook als je CALL gebruikt. INVOKE zegt nog gekkere dingen over een prototype die nodig is voor een procedure. (logisch, overigens) :grin:

    Ben echt bang dat ik me wat meer moet verdiepen in Nasm, maar het is gratis dus de kosten vallen hier gelukkig wel mee.

    Heb gisteren overigens allerlei sites over het maken van OSsen afgegaan en allemaal gebruiken ze Nasm en gcc voor het maken van bootloaders. Misschien een teken aan de wand? [img:262ab3b97e]http://216.40.201.240/s/otn/confused/shrug03.gif[/img:262ab3b97e]

Beantwoord deze vraag

Dit is een gearchiveerde pagina. Antwoorden is niet meer mogelijk.