[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


Anmelden zum Antworten