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,0BA24hDas 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
ENDMDabei 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. ]