fehlersuche
-
hmm.. danke erstmal für deine antwort
zu deinem tipp hätte ich eine frage:
masm schrieb:
- tue dir selbst eine Gefallen und benutz TASMs Hochsprachen-Konstrukte (MASM-Mode)
damit kann ich leider gar nichts anfangen
wir haben in der vorlesung dieses masm gar nicht benutzt.. und ich hab leider nicht die zeit dafür mir das beizubringen...
-
Du benutzt TASM? - meine ich zumindest gelesen zu haben -> TASM hat zwei modien: den IDEAL-mode unde den MASM-mode. Zwischen ihnen wechseln tut man mit den Schlüsselwörtern IDEAL und MASM. Der Syntax ist sehr ähnlich zu aus C bekannten if/else if/else-Konstrukten:
.code MASM mov ax,1 mov dx,2 xor bx,bx .if ax == 1 && dx != 2 ; Vergleichs-Operatoren: ==,!=,<,>,<=,>= mov bx,1 .elseif ax == 1 && dx == 2 ; logische Verknüpfungen: && , || mov bx,2 .endif ; bx = 2
-
hier mal ein Beispiel wie man das Menü implementiern könnte:
MASM ; masm-mode .model small .Stack 100h ; Ausgabe-macros definieren sz macro arg LOCAL szLbl .data szLbl db arg,'$' .code mov dx,OFFSET szLbl endm num macro n LOCAL numLbl .data numLbl db n db '$' .code mov dx,OFFSET numLbl endm print macro args:VARARG FOR arg,<&args> xyz INSTR 1,<&arg>,<"> IF xyz sz arg ELSE num arg ENDIF mov ah,09h int 21h ENDM endm .Code start: mov ax, @data mov ds, ax print "Wilkommen",13,10 @menu: print "Bitte Operation Wählen:",13,10 print 9,"Motor [0]",13,10 print 9,"Ansage [1]",13,10 print 9,"stop [2]",13,10 print 9,"Heizung [3]",13,10 print 9,"beenden [4]",13,10 .while 1 ; unendlich Schleife mov ah,0ch ; Einghabepuffer löschen int 21 ; mov ah,08h int 21h .if al == '0' call proc1 .elseif al == '1' call proc2 .elseif al == '2' call proc3 .elseif al == '3' call proc4 .elseif al == '4' .break ; ausbruch aus Schleife -> Prog beenden .else print "Falsche eingabe!",13,10 jmp @menu .endif .endw mov ax, 04c00h int 21h proc1 proc print "Motorsteuerung",13,10 ret proc1 endp proc2 proc print "Ansage",13,10 ret proc2 endp proc3 proc print "stop",13,10 ret proc3 endp proc4 proc print "Heizung",13,10 ret proc4 endp end start
-
hmm ja das sieht eigentlich besser aus, erinnert sehr an c programmierung mit dem else if und so..
das problem ist das mein dozent diese version nicht möchte
ich kann ihm sowas doch in der prüfung nicht hinklatschen
-
cookielein schrieb:
hmm ja das sieht eigentlich besser aus, erinnert sehr an c programmierung mit dem else if und so..
das problem ist das mein dozent diese version nicht möchte
ich kann ihm sowas doch in der prüfung nicht hinklatschen
warum nicht? - es ist ein Bestandteil des Assemblers!
-
cookielein schrieb:
hmm ja das sieht eigentlich besser aus, erinnert sehr an c programmierung mit dem else if und so..
das problem ist das mein dozent diese version nicht möchte
ich kann ihm sowas doch in der prüfung nicht hinklatschen
Wuerde ich auch nicht empfehlen, es sei denn du legst es darauf an, das Unterrichtskonzept zu sabotieren.
Ist vielleicht uebersichtlich und kann evtl. vom TASM verarbeitet werden (obwohl ich nicht weiss, ob die MASM-Unterstuetzung beim TASM so weit reichte), aber das ist eben kein Assembler-Code, sondern MASM-Code.
-
Es kann hilfreich sein, seine Programmteile modular anzulegen. Auf diese Weise lassen sich bestimmte Module testen und austauschen - das kann u.a. die Fehlersuche sehr erleichtern.
Auf diese Weise findet man auch schneller falsche Assembler- oder Linkeraufrufe o.ä.z.B.
Ausgabe1: push ax mov ah,09 int 21 pop ax ret
und Aufrufen mit Call Ausgabe1
Für das vorgelegte Programm empfiehlt sich außerdem, es schrittweise im Debugger auszuführen. Nur die Interrupts sollten nicht schrittweise durchgangen werden, die müssen im Ganzen ausgeführt werden.
Da bestimmte Fehler wie:
heizung: mov ah,08h int 21
auch häufiger vorkommen, kann man sich die Assemblerdirektive EQU zunutze machen:
(auf diesen praktischen Trick bin ich gar nicht selber gekommen, der stand in dem Buch Programmiersprache Assembler von Reiner Backer drin)int 21 EQU int 21h
-
nachtfeuer schrieb:
int 21 EQU int 21h
zeig mir mal einen Assembler, der das Schluckt.
-
DeinMeiser schrieb:
nachtfeuer schrieb:
int 21 EQU int 21h
zeig mir mal einen Assembler, der das Schluckt.
Ok Ok, Sorry - ein Leerzeichen zuviel - es müsste heißen
int21 EQU int 21h
Sehen wir Sie denn demnächst auch mal wieder in einer tollen Talkshow, Herr Meiser?
-
welche bücher benutz du denn wenn ich mal fragen darf ?
also ich hab die bücher
Assembler: Maschinennahes Programmieren von Anfang an. Mit Windows-Programmierung [Taschenbuch]
Backer, ReinerAssembler ge-packt
Rohde, JoachimAssembler: Grundlagen der Programmierung
Roming, Marcus3 bücher und ich komm trotzdem nicht weiter xD
-
Mal eine andere Frage, was erhoffst du dir von der Assembler-Programmierung?
Das Windowszeugs wird dir nicht viel bringen, außer für eine paar dreckige Hacks. Und die maschinennahe Programmierung ist ja ganz fein, aber eigentlich bringt dir das auch nicht viel. Die Befehle sind nicht bei jedem Assembler gleich, die CPUs haben teilweise unterschiedliche Befehle. Und was noch viel wichtiger ist, die CPUs wollen Aufgaben teilweise völlig unterschiedlich lösen. Mehr als ein wenig Grundverständnis wie so eine Maschine tickt wirst du also nicht erhalten. Da kommt aber auch in C eine Menge rüber, besonders was das praxisrelevante Wissen betrifft.
-
was ich mir erhoffe ? naja um es klar und deutlich zu sagen, ich erhoffe mir die prüfung zu bestehen :))
-
mein fehler ist doch bei der schl5 oder ?
-
ah ich hab mein fehleeeeeer.......... ein h vergessen und alles geht drunter und drüber xD