extern



  • Servus!

    Folgendes Problem:

    Ich habe 2 .asm Dateien die 1. das Hauptprogram z.B

    extern ex
     segment .code 
     ..start
     mov ax,ex
     ret
    

    das 2. Modul mit der ex-Definition:

    global ex
    section .data 
    ex db 'A'
    

    Aber es funktioniert nicht das #ax adresse von ex ist ,sondern #ax kriegt immer falschen wert (0000) warum? bzw. wie ist es richtig?



  • ich benütze Nasm...



  • Bei jedem nasm gibt es einen Disassembler ndisasm. Damit kannst Du den Code disassemblieren und überprüfen, was nasm mit "mov ax, ex" meint. Bei Intel-Syntax weiss man es nie... Vielleicht muss man so was wie "mov ax, [ex]" eingeben.



  • Hallo und Danke erstma für deine Antwort!

    Also es geht mir eigentlich darum das ich auf einer Variablen aus einer anderen Datei bzw. Modul zugreifen will was mir aber bisher nicht gelungen ist...

    Hab mir das auch schon über Debugger angeschaut (GRDB,TD) und zeigt mir an
    das #mov ax,ex# also die adresse von ex! immer falsch ist und zwar 0000 offset.
    im Programcode liegt sie aber bei 0010..



  • Wie baust Du das Zeug eigentlich? Makefile?



  • erstma assembliere ich Beide zu Obj-files dann über alink zu .exe
    nasm 1.asm -fobj
    nasm 2.asm -fobj
    alink 1.obj 2.obj



  • Drew schrieb:

    extern ex
     segment .code 
     ..start
     mov ax,ex
     ret
    
    global ex
    section .data 
    ex db 'A'
    

    "ex" ist nur eine Sprungmarke und damit eine Adresse. Richtige Syntax also mit "[]", wenn du an den Wert willst.

    Da es sich um ein Byte handelt wirst du mit "mov ax, ex" nicht viel erfolg haben.

    Entweder:

    mov al, BYTE PTR [ex]
    

    oder:

    movzx ax, BYTE PTR [ex]
    


  • Nabend!

    so hab die ex-variable mal mit im 1. Modul gemacht also nur ein Modul und da ist mir doch gleich ein sehr grober Anfängerfehler aufgefallen (ich trottel), hab dann
    nämlich mal das Datensegment mit der data-section initialisiert... na klar das klappt doch wunderbar.....o.k

    Aber nun neue Fragen:

    Wie schreibe ich den Code wenn die .data-section extern ist, weil wenn ich nur schreibe #mov ax,data... sagt mir nasm er kann kein data finden

    Also muß ich ihm doch sagen können das .data extern ist ?! aber wie?

    Modul 2 (externe .data sect mit sk)

    global sk
    section .data  
    sk db 'HALLO$'
    

    Modul 1 (main)

    CPU 386
    extern sk
    section .code 
    ..start:
    mov ax,data ;Fehler..wie sag ich nasm das data woanders ist??
    mov ds,ax
    mov al,byte[sk]
    mov ah,4ch
    int 21h
    

    2. Frage:

    Wie könnte ich den folgeneden Code umschreiben das er wie im FLAT-model läuft,
    weil soweit ich weiß liegen ja da Code und Daten sozusagen im selben Segment
    aber das klappt hier nicht ?!

    CPU 386
    section .data use32
    sk db 'HALLO$'
    section .code use32
    ..start:
    mov eax,sk
    ret 0

    Danke für eure Aufmerksamkeit!!


Anmelden zum Antworten