fehlersuche
-
irgendwie tue ich mich mit assembler ganz schön schwer... obwohl ich es grundsätzlich verstanden habe, habe ich immernoch fragezeichen im kopf
zum beispiel komme ich bei dieser aufgabe nicht auf meinen fehler.. ich denke eigentlich das entweder ein jump befehl fehlt oder das einer falsch ist..
ich stell mal den code hier rein.. und mein fehlerabfangcode ist irgendwie auch nicht richtig -.-.model small ;Festlegung des Speichermodells include macros.mac .Stack 100h .Data ;Beginn des Datensegments motor0 db "motor aus", 10,13,"$" ;Zustande werden zugewiesen motor1 db "motor an", 10,13,"$" ansage0 db "ansage aus" , 10,13,"$" ansage1 db "ansage an",10,13,"$" stop0 db "stop aus" ,10,13, "$" stop1 db "stop an",10,13, "$" heizung0 db "heizung aus" ,10, 13, "$" heizung1 db "heizung an" ,10,13, "$" willkommen db "Bitte geben Sie die 1 fuer an oder die 0 fuer aus ein: " ,10,13, "$" fehler db "Sie haben eine falsche Angabe gemacht!" ,10 ,13 ,"$" .Code ;Beginn des Codesegments start: ;data wird dem ax-Register zugewiesen mov ax, @data mov ds, ax mov dx, offset willkommen mov ah, 09h int 21h mov cx,4 schl1: push ax ;schiebe ax cmp cx,4 ;vergleiche cx mit 3 je motor ;springe zu motor schl2: cmp cx,3 ;vergleiche cx mit 2 je ansage ;springe zu ansage schl3: cmp cx,2 ;vergleiche cx mit 1 je stop ;springe zu stop schl4: cmp cx,1 ;vergleiche cx mit 0 je heizung ;springe zu heizung schl5: loop schl1 ;fuehre schl1 cx mal aus ;fehlerabfangen cmp ah,30h jb ausgabefehler ;wenn springe darunter cmp ah,31h ja ausgabefehler ;wenn springe daruber ausgabefehler: mov dx,offset fehler mov ah, 09h int 21h jmp schl1 motor: mov ah,08h ;Funktion zum Einlesen von Zeichen int 21h cmp al,30h je motor00 jne motor01 motor00: mov dx,offset motor0 mov ah,09h int 21h jmp schl2 motor01: mov dx,offset motor1 mov ah,09h int 21h jmp schl2 ansage: mov ah,08h int 21h cmp al,30h je ansage00 jne ansage01 ansage00: mov dx,offset ansage0 mov ah,09h int 21h jmp schl3 ansage01: mov dx,offset ansage1 mov ah,09h int 21h jmp schl3 stop: mov ah,08h int 21h cmp al,30h je stop00 jne stop01 stop00: mov dx,offset stop0 mov ah,09h int 21h jmp schl4 stop01: mov dx,offset stop1 mov ah,09h int 21h jmp schl4 heizung: mov ah,08h int 21 cmp al,30h je heizung00 jne heizung01 heizung00: mov dx,offset heizung0 mov ah,09h int 21h jmp schl5 heizung01: mov dx,offset heizung1 mov ah,09h int 21h jmp schl5 mov ax, 04c00h int 21h end start
-
Tipps:
- INT's ändern den Inhalt der Register
- push ohne pop (insbesondere in Schleifen) kann zu einem Stacküberlauf führen
- tue dir selbst eine Gefallen und benutz TASMs Hochsprachen-Konstrukte (MASM-Mode):MASM .if ax == x ... .elseif dx != 9 && cx < ax ... .else ... .endif ; oder .while/.endw .repeat/.until
Ansonsten mal an der Logik des Programms arbeiten
-
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