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, Reiner

    Assembler ge-packt
    Rohde, Joachim

    Assembler: Grundlagen der Programmierung
    Roming, Marcus

    3 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


Anmelden zum Antworten