Assembler x86 Codeproblem

Gast #198263
Lesenswert?

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

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren