Unterprogramm vs. Makro



  • Assembler ist doch denk ich mal zu komplex, um es in C zu entwerfen, wie stellen die das an?

    Außerdem: was bringt das mit den EAX? Man kann genausogut auch AX benutzen...

    PS: hab halt ein Dos- Assembler- Tutorial 🙂



  • Original erstellt von pAngel:
    Assembler ist doch denk ich mal zu komplex, um es in C zu entwerfen, wie stellen die das an?

    Assembler ist noch geradezu trivial zu kompilieren. Man hat kaum mit der Syntax zu wursten, wie es in C der Fall wäre. Man braucht halt nur große Tabellen um die ganzen Opcodes zu regeln. Das ist nicht soo schwer.

    **
    Außerdem: was bringt das mit den EAX? Man kann genausogut auch AX benutzen...
    **

    Könnte man. Aber spätestens bei ESP/EBP/ESI/EDI hörts auf, denn im 32-Bit-Modus braucht man 32-bit-Adressne und die passen in ein 16-Bit-Register wie SI nunmal nicht rein 🙂 Im Übrigen sind 16-Bit für viele größere Rechnungen einfach nicht mehr genug (neben Speicherberechnungen), auf einem 32-Bit-System ist ein normales Register nunmal 32 Bit breit, man könnte sonst auch fragen, wozu AX benutzen, gibt doch AL 😉



  • es geht darum, dass du mit 32bit - registern grössere zahlen benutzen kannst.
    16bit : zahlen von 0 bis 2^16-1
    32bit : zahlen von 0 bis 2^32-1



  • Naja, hab mal was in Sachen Makros ausprobiert:

    Datei 1: STRING.LIB

    PRINT MACRO STRING
            MESSAGE DB STRING, 10, 13, "$"
            MOV DX, OFFSET MESSAGE
            MOV AH, 09H
            INT 21H
          ENDM
    

    Datei 2: AUSGABE.ASM

    INCLUDE STRING.LIB
    
    DATA SEGMENT
    DATA ENDS
    
    STACK SEGMENT BYTE STACK
            DW 128 DUP (?)
    STACK ENDS
    
    CODE SEGMENT
     START: ASSUME SS:STACK, DS:DATA, ES:NOTHING, CS:CODE
            PRINT "Imagine all the people!"
    
            MOV AH, 4CH
            INT 21H
    CODE ENDS
            END START
    

    Warum geht das irgendwie net richtig (bzw. wird mir lauter schrott ausgegeben, und nicht "Imagine all the people!")?

    Und: ich kann "PRINT" nur einmal in "Ausgabe.asm" benutzen, weil dann die Fehler- Meldung kommt, dass der Offset Message bereits definiert wurde. Wie stelle ich das an?

    [ Dieser Beitrag wurde am 08.04.2003 um 13:15 Uhr von pAngel editiert. ]



  • Hi.

    Der Assembler setzt die Macros genau so, wie sie oben definiert sind ein... D.h. bei der Aufloesung deines Macros wird folgender Code produziert:

    DATA SEGMENT
    DATA ENDS
    
    STACK SEGMENT BYTE STACK
            DW 128 DUP (?)
    STACK ENDS
    
    CODE SEGMENT
     START: ASSUME SS:STACK, DS:DATA, ES:NOTHING, CS:CODE
            MESSAGE DB "Imagine all the people!", 10, 13, "$"
            MOV DX, OFFSET MESSAGE
            MOV AH, 09H
            INT 21H
    
            MOV AH, 4CH
            INT 21H
    CODE ENDS
            END START
    

    Wie man sieht, wird hierbei der Text mit "ausgefuehrt".



  • Original erstellt von Nobuo T:
    Wie man sieht, wird hierbei der Text mit "ausgefuehrt".

    hä?



  • DB "Imagine all the people!", 10, 13, "$"
    entspricht:
    DB 49h, 6Dh, 61h, 67h, 69h, 6Eh, 65h, 20h, 61h, 6Ch, 6Ch, 20h, 74h, 68h, 65h, 20h, 70h, 65h, 6Fh, 70h, 6Ch, 65h, 21h, 0Ah, 0Dh, 24h
    und das wiederum entspricht folgenden OpCodes:
    dec cx
    insw
    popa
    imul bp,[esi+65h],6120h
    insb
    insb
    and [si+68h],dh
    and gs:[bx+si+65h],dh
    outsw
    jo $+6Ch
    and gs:[bp+si],cx
    or ax,0BA24h

    Das alles wird in deinem code ausgefuehrt, bevor der Int 21h zum Textausgeben aufgerufen wird...
    Dabei verschwindet zB. das erste Byte der Instruktion mov dx,offset MESSAGE in der Instruktion or ax,0BA24h (mov dx,????h ist 0BAh,??h,??h)
    Somit gibts ein falsches Offset in dx und es wird noch ein bissel was im Segment 0000h (die Instruktionen mit gs) umgeschrieben...

    Hoffe das war jetzt verstaendlich. 🙄

    [ Dieser Beitrag wurde am 08.04.2003 um 14:41 Uhr von Nobuo T editiert. ]

    [ Dieser Beitrag wurde am 08.04.2003 um 14:45 Uhr von Nobuo T editiert. ]



  • hm... und was kann man dagegen machen?

    [ Dieser Beitrag wurde am 08.04.2003 um 14:49 Uhr von pAngel editiert. ]



  • Man koennte zB. den Text ueberspringen.
    PRINT MACRO STRING
    jmp short @@PrintText
    MESSAGE DB STRING, 10, 13, "$"
    @@PrintText:
    MOV DX, OFFSET MESSAGE
    MOV AH, 09H
    INT 21H
    ENDM

    Dabei ergibt sich natuerlich wieder das leidige Problem mit den doppelt definierten Symbolen, wenn Du versuchst 2 dieser Macros in einer proc unterzubringen... Hab fuer dieses Problem leider noch keine wirklich sinnvolle Loesung gefunden.



  • also sind diese Variablen oder Offsets in Assembler alle global?
    Eine Lösung dafür wird also wirklich schwierig ...

    Übrigens geht das mit "JMP" auch nicht, aber ich weiß, was du meinst und warum es nicht geht ...

    [ Dieser Beitrag wurde am 08.04.2003 um 20:11 Uhr von pAngel editiert. ]


Anmelden zum Antworten