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