NASM Syntaxproblem



  • Hallo,
    habe schon gesucht und gesucht und rumprobiert, aber ich bekomme folgendedrei Zeilen nicht in NASM code umgesetzt. Weiß einer von euch, wie das richtig sein muss? Danke!

    b           equ byte ptr
    w           equ word ptr
    d           equ dword ptr
    


  • Moin sevobal,

    um unter NASM den Datentyp bei indirekter Adressierung anzugeben, benutzt Du byte, word, dword (ohne Ptr), also

    mov  byte [ebx], 0xff
    mov  word [ebx], 0xffff
    mov  dword[ebx], 0xffffffff
    

    Du kannst statt equ %define benutzen:

    %define b byte
    %define w word
    %define d dword
    

    Ciao...



  • cool, danke hat alles bestens geklappt, bis auf diese eine sache, damit komme ich noch nicht ganz klar:

    gdt_adr     GDTSTRUC ?
    

    DANKE!



  • Moin sevobal,

    die Benutzung von Strukturen ist unter NASM etwas gewöhnungsbedürftig(für meinen Geschmack zumindest).

    Definition einer Struktur:

    struc GDTSTRUC
    .limit	resw 1
    .base   resd 1
    endstruc
    

    Eine Instanz erzeugen:

    gdt_adr:
    	istruc	GDTSTRUC
    	  at GDTSTRUC.limit, dw 24 ; Größe der Deskriptortabelle in Bytes(hier: 3 Einträge á 8 Bytes)
    	  at GDTSTRUC.base,  dd Adresse_der_Deskriptortabelle
    	iend
    

    Die Instanz der Struktur wird mit gdt_adr angesprochen.

    Ciao...



  • ql danke, ist in der tat eine wenig gewöhnungbedürftig....ich habe in der doc von nasm gestöbert und dort den hinweis gefunden, dass der befehle assume: nicht unterstützt wird und ich habe dort auch keine ersatz befehl gefunden....gibts da auch keinen?



  • Moin sevobal,

    nein, tatsächlich kennt NASM die Direktive assume nicht. Es gibt auch kein Ersatz dafür. Hier liegt mehr Verantwortung beim Programmierer, der Acht geben sollte, welche Werte in die Segmentregister geschrieben werden. Eigentlich braucht man assume auch nicht, ist halt eine nette Unterstützung seitens des Assemblers.

    Ebensowenig unterstützt NASM übrigens die Speichermodelle. Auch hier muss der Programmierer mehr Hand anlegen und wissen, was er macht(bei Sprungbefehlen etc).

    Ciao...



  • gut zu wissen, bleibt nur noch:

    LGDT gdt_adr
    

    warum akzeptiert der assembler das net und sagt mir das sei eien ungültige Kompination von Opcode...?

    achja und da ist noch was mit der stack structur, im handbuch steht zwar, dass es den befehl segment stack gibt, aber wird auch net akzeptiert....



  • Moin sevobal,

    die Anweisung muss lauten:

    lgdt [gdt_adr]
    

    Die eckigen Klammern bewirken, dass der Inhalt der Speicherzellen, auf die der Zeiger gdt_adr zeigt, in das Register geladen wird.

    Ohne die Klammern würdest Du versuchen den Wert des 32-Bit-Zeigers(nämlich gdt_adr)selber in das Register zu laden. Das kann natürlich nicht klappen, denn es wird ja ein Zeiger auf die Kombination von 16-Bit Limit und 32-Bit Adresse erwartet.

    Ciao...


Anmelden zum Antworten