Funktionen und Macros aus anderen dateien aufrufen



  • halle alle zusammen,

    wie muss ich procedures/macros definieren um sie von anderen dateien aus aufrufen zu können? bei procs hab ich das immer so gemacht:

    ;file1.asm
    public f
    f proc far
    ...
    ret
    f endp
    

    und im anderen dann

    ;file2.asm
    extrn f:far
    

    soweit dürfte es auch noch klappen, allerdings lässt sichs nicht assemblieren, da irgendwas mit den macros nicht stimmt. nur nochmal zur sicherheit: ein macro kann, genauso wie eine procedure, im codeseg stehen, wird begrenzt durch eine macro ... endm und braucht kein ret, soweit doch alles korrekt oder? also jedenfalls macht das makro folgendes

    m macro
    push bx
    mov bx, 1234h
    call f
    pop bx
    m endm
    

    wenn ich die makros nicht drintstehn habe geht alles gut, wenn doch, dann schreibt er mir, das segment 'code' wäre noch offen, oder eben nicht zu oder sowas in der art...
    jetzt die eigentliche frage: wie muss man makros definieren (also wo muss ein public/extrn stehen und far gibts ja für macros nicht oder?) damit sie von einer anderen datei aus aufgerufen werden können? falls das von bedeutung ist: ich verwende den 16-bit tasm, beide dateien sind small, file1 hat ein code- und datensegment, file2 nur eine codesegment.

    Vielen Dank schonmal im Voraus



  • 1. IMHO: Falls nicht unbedingt noetig, solltest du es vermeiden, Dateien einzeln zu assemblieren und hinterher zu linken. Besser ist da, Assembler-Dateien direkt mittels "include" einzubinden. Dann brauchst du auch den ganzen Spass mit "extrn" nicht mehr.
    Include funktioniert praktisch in etwa so, dass der Inhalt der einzubindenden Datei direkt an der Stelle, an der das include steht, eingefuegt wird. Dh. du brauchst uU. noch nicht mal die Segmentdefinitionen in den eingebundenen Dateien wiederholen.

    2. Macros sind etwas komplett anderes als Procs. Die werden nicht wie Funktionen aufgerufen, sondern beim Assemblieren direkt in den Code eingefuegt.
    Deshalb kannst du sie nur via include von anderen Dateien aus einbinden. extrn o.Ae. funktioniert damit nicht und fuer den Linker sind sie auch nicht existent.
    Schau dir ggF. nochmal Tutorials zu Macros allgemein in Programmiersprachen an.

    Mehr kann ich mit den wenigen Infos erstmal nicht dazu sagen.



  • vielen dank nobuo T! das mit dem include dürfte schon die meisten probleme beheben... was makros sind wusste ich schon in etwa (auch aus C, weil du ja andere programmiersprachen angesrpchen hast) nur ist mir nicht klar, warum der tasm meckert, das codeseg sei noch offen 😕 werds gleich nochmal schaun und auch das include ausprobiern 👍



  • als ich weiß jetzt wann der fehler mit dem offenen codeseg auftritt, und zwar sobald ein macro im code ist, kann mir aber nich erklärn warum. das hier lässt sich assemblieren:

    model tiny
    code segment
    assume cs:code
    org 100h
    start:
    mov ax, 4c00h
    int 21h
    code ends
    end start
    

    das nicht 😕

    model tiny
    code segment
    assume cs:code
    org 100h
    start:
    jmp ende
    m macro
    m endm
    ende:
    mov ax, 4c00h
    int 21h
    code ends
    end start
    

    hier wird eben nur ein macro definiert, und da's im codeseg steht übersprungen. und genau dann meldet mir der tasm folgendes

    Open segment: CODE
    Unexpected end of file encountered

    beide meldungen beziehen sich auf Z 14 also schon eine leere zeile. woher kommt der fehler??

    @ Nobuo T: wie soll ich das mit dem include machen? dann hätte mein programm ja theoretisch mehrere codesegs/datasegs. small würde dann als speichermodell ja schonmal mindestens wegfallen oder?



  • Noe. Wie gesagt: include packt den Inhalt der eingebundenen Datei an die Stelle des Schluesselworts.
    zB.
    main.asm:

    model tiny
    
    codeseg
    start:
    call myProc
    mov ax, 4C00h
    int 21h
    
    include "proc1.inc"
    END start
    

    proc1.inc:

    proc myProc NEAR
    
    ret
    
    endp myproc
    

    Sollte funktionieren.

    Zu dem von dir beobachteten Verhalten: TASM ist bei Weitem nicht bugfrei... Vor allem was Macros betrifft. 😉
    Probier halt das Macro ausserhalb des Segments zu definieren.



  • Jo Vielen Dank für die Hilfe! 👍



  • wohl doch etwas zu früh gefreut 😞
    der tasm kann die datei nicht finden. weder wenn ich im code den kompletten pfad angebe, noch wenn ich einfach den namen der datei, und beim assemblieren die option "/ic:\tasm" (i=includepath) angebe. pfade stimmen soweit, '\' und '/' hab ich auch schon vertauscht... gibts hier jemanden, der mit dem tasm schonmal andere dateien eingebunden hat?


Anmelden zum Antworten