[8086]Hilfe bei Potenzrechnung
-
Wie gesagt brauche ich Hlfe bei der Potenzrechnung in 8086. Ich komme eigentlich ganz gut voran. Nur bei negativen Basen und Exponenten kommt es zu Overflow und bei Eingabe anderer Zeichen(z.B. 1A, KL) habe überhaupt kein Plan. Das ist erst mal was ich bisher habe.
.MODEL SMALL .STACK 100h .DATA basis dw ? exp dw ? erg dw ? abf dw ? include macros.mac jumps .code call expn expn proc dec cx mov bx, ax ;basiswert ist gerettet M1: imul bx jo M2 loop M1 M2: ret endp START: mov ax,@DATA mov ds,ax prog: print "Geben SIe die Basis ein" nl readZ basis mov ax, basis ;div ax, 10 cmp al, 9 ja prog cmp ah, 9 ja prog ;sub ax, 30h ;cmp ax, 9h ;jg prog print "Geben Sie den Exponent ein" nl readZ exp mov cx, exp cmp cx, 0 je erg1 cmp cx, 1 je erg2 call expn mov erg, ax print "Ergebnis: " writeZ erg nl abf: print "Nochmal(j/n): " reads abf cmp abf, 6ah je prog cmp abf, 4ah je prog cmp abf, 6eh jmp ende cmp abf, 4eh jmp ende erg1: print "Ergebnis: 1" jmp abf erg2: print "Ergebnis: " writeZ basis jmp abf ende: mov ah,4Ch int 21h end start
-
Du brauchst noch was, was die Eingaben überprüft, Untergrenze (30h) Obergrenze (39h) und guckt, ob eben ein negativer Wert vorliegt, ein bißchen kannst du das selbst interpretieren. Und bei 16 Bit macht man dem Rechner ein paar Komplimente, und der fängt dann an bei allen Zahlen ab 8000 mit Negativen zu rechnen.
Und ein wenig Rückwärtszählen von 100h auf E0h (also 100, FF, FE, FD usw.) hilft vielleicht auch ein wenig, durchzublicken. Aber darüber hinaus sollte man auch wissen, wie vielleicht ein Minuszeichen in AL aussieht.
Kann man eigentlich direkt in Debug ausprobieren:Microsoft Symbolic Debug Utility Version 2.00 (C) Copyright Microsoft Corp 1984, 1985, 1986 Processor is [80386] -a 1E6D:0100 mov ah,08 1E6D:0102 int 21 1E6D:0104 cmp al,2d 1E6D:0106 jnz 102 1E6D:0108 nop 1E6D:0109 nop 1E6D:010A nop 1E6D:010B -t AX=0800 BX=0000 CX=0000 DX=0000 SP=E082 BP=0000 SI=0000 DI=0000 DS=1E6D ES=1E6D SS=1E6D CS=1E6D IP=0102 NV UP EI PL NZ NA PO NC 1E6D:0102 CD21 INT 21 ;Read Keyboard -p AX=082D BX=0000 CX=0000 DX=0000 SP=E082 BP=0000 SI=0000 DI=0000 DS=1E6D ES=1E6D SS=1E6D CS=1E6D IP=0104 NV UP EI PL NZ NA PO NC 1E6D:0104 3C2D CMP AL,2D ;'-' -
usw.
-
"abf" einmal als Datenword im Datensegment + einmal als Sprungmarke im Codesegment, geht so etwas?
Und braucht man bei "cmp abf, 4ah" gar nicht angeben ob auf ein Byte, Word, oder Dword zugegriffen werden soll?
Dirk