mikrocontroller.net

Forum: Offtopic Assembler x86 Codeproblem


Autor: Mike Schwarz (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail, Yahoo oder Facebook? Keine Anmeldung erforderlich!
Mit Google-Account einloggen | Mit Facebook-Account einloggen
Noch kein Account? Hier anmelden.