Gast
#198263
Hallo, habe folgendes Problem: Warum kann im folgende Programm (fett markierter Abschnitt) der call adresse[si] nicht durchgeführt werden? Gebe ich jedoch plus, oder minus ein funktionert das Programm. Wo mache ich einen Fehler??? Gruß Mike ; 8086 Code Template ; Directive to make EXE output: #MAKE_EXE# dataseg SEGMENT 'DATA' adresse dw plus, minus, mult z1 db 100 z2 db 50 ergebnis dw ? operator db '+', 2Dh, 101010b dataseg ENDS stseg SEGMENT STACK 'STACK' dw 16 dup(0) stseg ENDS codeseg SEGMENT 'CODE' ;**************Hauptprogr amm*************** HAUPT PROC FAR ; sichern der Rücksprungadresse ins OS push ds ; DS-Register in den Stack retten mov ax,0 ; AX-Register leeren push ax ; AX-Register in den Stack retten ; Segmentregister initialisieren mov ax,dataseg mov ds,ax ; unser Code - eigentliches Programm mov bl,z1 ; 'z1' in den Lowanteil vom BX-Register mov cl,z2 ; 'z2' in den Lowanteil vom CX-Register m1: mov si,0 ; SI-Register auf "0" "zurücksetzen" mov ah,1 ; Zeicheneingabe int 21h ; ASCII cmp al,operator[si] ; Vergleicht Operator mit Inhalt Lowanteil AX-Register "Eingabe=+?" je addition ; Vergleich übereinstimmend, dann "Sprungmarke" inc si ; SI Inkrementieren --> "zeigt nun auf 2Dh (Minus)" cmp al,operator[si] ; Vergleicht Operator mit Inhalt Lowanteil AX-Register "Eingabe=2Dh?" je subtraktion ; Vergleich übereinstimmend, dann "Sprungmarke" inc si ; SI Inkrementieren --> "zeigt nun auf 101010b (Multi)" cmp al,operator[si] ; Vergleicht Operator mit Inhalt Lowanteil AX-Register "Eingabe=101010b?" je multiplikation ; Vergleich übereinstimmend, dann "Sprungmarke" jmp m1 ; Unbedingter Sprung nach "Sprungmarke" addition: call adresse[si] ; call adresse[si] ??? <----------hier zum Beispiel!!! jmp m2 ; Unbedingter Sprung nach "Sprungmarke" subtraktion: shl si,1 ; verschiebt die Bits SI um ein Bit nach links und schiebt rechts eine "0" nach (Multiplikation mit 2) call minus ; call adresse[si] ??? jmp m2 ; Unbedingter Sprung nach "Sprungmarke" multiplikation: shl si,1 ; verschiebt die Bits SI um ein Bit nach links und schiebt rechts eine "0" nach (Multiplikation mit 2) call mult ; call adresse[si] ??? jmp m2 ; Unbedingter Sprung nach "Sprungmarke" m2: mov ergebnis,dx ; DX-Register nach Ergebnis speichern ret ; zurück ins OS HAUPT ENDP ;********ENDE**Hauptprogr amm**ENDE********* plus PROC mov dl,bl ; Lowanteil BX-Register nach Lowanteil DX-Register add dl,cl ; Addiere Low DX-Register mit Low CX-Register und speichere in Low DX-Register mov dh,0 ; High DX-Register "0" ret ; Return ins Hauptprogramm plus ENDP minus PROC mov dl,bl ; Lowanteil BX-Register nach Lowanteil DX-Register sub dl,cl ; Subtrahiere Low DX-Register mit Low CX-Register und speichere in Low DX-Register mov dh,0 ; High DX-Register "0" ret ; Return ins Hauptprogramm minus ENDP mult PROC mov al,bl ; Lowanteil BX-Register nach Lowanteil AX-Register mul cl ; 8 Bit Multiplikation mit Low CX-Register und speichert in AX-Register mov dx,ax ; AX-Register nach DX-Register ret ; Return ins Hauptprogramm mult ENDP codeseg ENDS END START