Assembler - Stack und Felder

Hallo zusammen,

ich bin Assembler-Anfänger und Ich bin seit einigen Tagen an einem Problem dran, was Ich einfach nicht hin bekomme.

Und zwar habe Ich 2 Felder:

.data
    Zahl            dw -32000,-8, -1                                     
    Zeichen            db ‚+‘, 8 dup(’ ')

So, im ehemaligen Programm habe Ich die Felder direkt aufgerufen und konnte die einzelnen Elemente aus Zahl auslesen und in Zeichen Zwischenspeichern. Die Zahl ergab dann -32000,81 in der Bildschirmausgabe…

Nun sollten wir das alles mit Unterprogrammen „schöner“ gestalten. Gut, dachte Ich und machte:

lea dx,Zahl
    push dx
    mov dx,0
    lea dx,Zeichen
    push dx

Im Unterprogramm dann eben als erstes den P gesichert in BP per move.

Danach wollte Ich z.B. das erste Element von zahl in das ax Register schreiben.

    mov     di, 0
    mov     ax, [bp+4+di]

und wenn Ich Zeichen brauchte eben nur den [bp+2+die Zahl, dessen Element Ich wollte].

Nunja, das klappt irgendwie nicht so ganz. =/
Ich habe die Adresse im Basepointer geschrieben, des jeweiligen Feldes. Jetzt könnte Ich doch, wenn Ich z.B. was in Zeichen rein schreiben will, doch nur

mov di,0
mov [bp+2+di], ax    ;Dann würde er mir doch in Zeichen im 0. Element was rein
                                ;schreiben, oder?

Hier ist das original Programm, was Ich habe:

=============================================================

.data
    Zahl            dw -32000,-8, -1     ; positive oder negative
                                         ; Zahl mit 2 Nachkomma-
                                         ; stellen
                                         
    Zeichen            db ‚+‘, 8 dup(’ ')
    Anzahl_VGA_S    db 80                ; Anzahl Spalten
                                         ; (VGA-Aufloesung)
;---------------------------------------------------------------    
.stack   16
;---------------------------------------------------------------
.code
    VGA     equ 0b800h      ;Segmentadresse des VGA Speichers
    S       equ 80
    Z       equ 2
    Smax    equ 79
    Farbe   equ 0fh
.startup
posneg:   
;======      
    cmp     Zahl[0], 0
    jge      positiv
    mov     zeichen[0], ‚-‘
      
    NEG     Zahl[0]   
    NEG     Zahl[2]
    NEG     Zahl[4]
    
    lea dx,Zahl
    push dx
    mov dx,0
    lea dx,Zeichen
    push dx   
    
 
    call dual_ascii
    call vga_offset
    call vga_ausgabe   
    pop dx
    pop dx
    .exit

positiv:
dual_ascii:
;==========
    mov     bp,sp
    mov     di, 0
    mov     si, 5 ;1
    mov     ax, [bp+4+di]      
    mov     bx, 10              ; muss nicht sein … siehe weiter unten
    mov        cx, 5
L1:    mov     dx, 0
    div     bx                  ; hier koennte auch direkt mit 10 geteilt werden …
    or      dl, ‚0‘
    mov     [bp+2+si], dl
    dec     si ;inc     si
    loop    L1
    
    add si, 6;5
    mov     [bp+2+si], ‚,‘
    mov     cx, 2
L2:      
    add di, 2
    mov     ax, [bp+4+di]
    or      al, ‚0‘
    inc     si
    mov     [bp+2+si], al
    loop    L2
                  
ret
; ------------------------------    

VGA_Offset:
;==========
    mov     ax, Z
    mul     Anzahl_VGA_S
    add     ax, S      
    shl     ax, 1       ; VGA-Offset-Ergebnis   
ret
; ------------------------------    

VGA_Ausgabe:
;===========         
    mov     bp,sp                 
    mov     dx, VGA
    mov     es, dx
    mov     bx, ax      ; VGA-Offset laden
    mov     ah, Farbe ;ah anstatt al
    mov     cx, 9;10
    mov     si, 0;1
L3:
    mov     al, [bp+2+si]
    mov     es:[bx], ax
    inc     si         
    inc     bx
    inc     bx
    loop    L3
ret
; ===========================================
END

Ich kapier es einfach nicht…mir wurde gesagt, Ich könnte auch den BP in einem weiteren Register speichern und den dann benutzen. Ist aber in meinen Augen doch unnötig, wenn es doch direkt über den BP doch auch geht…

Ausgabe sollte sein:     -32000,81
Ausgabe im o.g. Programm ist:   *symbol für Schippe*00000,0

Hallo

    mov     di, 0

versuch mal
mov di, [di]

    mov     ax, [bp+4+di]

ich glaub du landest nicht bei der richtigen adresse .

Hi,

jap, es war ein Adressfehler. Ich bin auf dem Stack herum gewandert von meiner Adresse.

Für die Nachwelt:

mov si,[Zahlen]
mov dx, [si]

Damit würde man Dinge aus dem Feld holen und ins dx schieben. ^^

Gruß,

Hanzo

1 Like

Danke für die Antwort