Forum: PC-Programmierung Array in Assembler programmieren


von Tobias Mehrl (Gast)


Lesenswert?

Hi Leute!

Ich hab ein Problem mit dieser Aufgabe:

In MACROS.ASM sind folgende Makros definiert, die Sie verwenden können:
ClrScr Löscht den User-Bildschirm
Set_Cursor Zeile, Spalte Setzt den Cursor an bestimmte Position Zeile 
und Spalte sind Bytes!
Read_KBD_and_Echo liest ein Zeichen (Byte) in Al ein und zeigt es am
Bildschirm an
Display_Char gibt ein Zeichen (aus DL) auf den Bildschirm aus
Einwickeln Sie nun ein Programm, mit dem Sie ein bestimmtes Element (M[i 
, j])
einer n x m – Matirx , einlesen können.
Die Eingabe von i und j soll über die Tastatur erfolgen – m und n können 
Sie fest vorgeben!
Es sollen nur Zahlen eingegeben werden können – ohne Vorzeichen!
Die Elemente der Matrix sollen jeweils 16-Bit groß sein!
Die Elemente der Matrix sollen mit 0FFFFh vorbelegt werden!
Nach der Eingabe des Elementes M(i,j) soll die Matrix auf den Bildschirm 
ausgegeben werden!

Hier nun mein bisheriger Lösungsansatz:
1
; --------------------------------------- Dateiname: a52.ASM ----------------------------------------------
2
; Array in Assembler
3
;
4
;
5
;------------------------------------------------------------------------------------------------------------------------------
6
7
%noctls                          ; Listing-Steueranweisungen werden nicht im Listing augegeben
8
%noincl                          ; Incude-Dateien werden nicht im Listing ausgegeben
9
10
INCLUDE MACROS.ASM                     ; Datei Macros.asm einbinden
11
ASSUME CS:CODE, DS:DATA                 ; Segmentnamen bekannt geben
12
                            ; „CODE“ wird Codesegment, „DATA“ wird Datensegment
13
14
;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
15
DATA    SEGMENT                    ; Beginn des Segmentes „DATA“
16
17
array    DW  0AH    DUP(0FFFFh)
18
      DW  0AH    DUP(0FFFFh)
19
      DW  0AH    DUP(0FFFFh)
20
      
21
    i  DW  0h
22
    j  DW  0h
23
  zahl  DW  0h
24
25
DATA    ENDS                    ; Ende des Segmentes „DATA“
26
;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
27
28
;-------------------------------------------------------------------------------------------------------------------------------
29
CODE     SEGMENT                    ; Beginn des Segmentes „CODE“
30
31
Anfang:    
32
; Zahll nach i einlesen:
33
      Read_KBD_and_Echo              ; Zeichen für i (Zeile) entgegennehmen
34
      SUB AX,30h                  ; Zahl berechnen
35
      XOR AH,AH                  ; Funktionsaufruf löschen
36
      MOV i,AX                  ; Zahl nach BX kopieren
37
      
38
; Zahl nach j einlesen:    
39
      Read_KBD_and_Echo              ; Zeichen für j (Spalte) entgegennehmen
40
      SUB AX,30h                  ; Zahl berechnen
41
      XOR AH,AH                  ; Funktionsaufruf löschen
42
      MOV j,AX                  ; Zahl nach DI kopieren
43
      
44
; Zahl nach DI einlesen:      
45
      Read_KBD_and_Echo              ; Zeichen für Element entgegennehmen
46
      SUB AX,30h                  ; Zahl berechnen
47
      XOR AH,AH                  ; Funktionsaufruf löschen
48
      MOV zahl,AX                  ; Zahl nach DI kopieren
49
      
50
; "zahl" in Abhängigkeit von "i" und "j" an die richtige Stelle schreiben
51
      
52
      MOV BX,i
53
      MOV DI,j
54
      
55
      MOV SI,[array[BX][DI]]
56
      MOV WORD PTR[SI],zahl
57
      
58
      MOV DL,array[BX][DI]
59
      ADD DL,30
60
      Display_Char
61
      
62
      
63
      Terminate_Program              ; Makro Terminate_Program aufrufen
64
65
CODE    ENDS                    ; Ende des Segmentes „CODE“
66
;-------------------------------------------------------------------------------------------------------------------------------
67
68
END Anfang                        ; Ende des Programms
69
                            ; Programm wird bei Anfang gestartet


Das Problem an meinem Code ist nur, dass wenn ich ihn assembliere ich 
zwei fehler bekomme. Nämlich: Zweile 56 und 58. Ich hab allgemein das 
Problem jetzt, dass ich nicht recht weiß, wie ich dem Programm jetzt 
beibringen soll, dass er mir die "Zahl" an die Stelle in Abhängigkeit 
von i und j schreiben soll.

Könnt ihr mir bis zur Lösung meines Problems stückchenweise helfen?

Edit: Womit auch immer noch Probleme hab, ist dieser Befehl mov WORD 
PTR[]... Könnt ihr mir mal da genau erklären was Sache ist? Ich finde 
dazu auch nicht wirklich was in meiner Literatur und im Internet find 
ich auch nix!

Danke!

von Tobias Mehrl (Gast)


Lesenswert?

Hi!

sorry, die Zeilen 56 und 58 sind die Zeilen: MOV WORD PTR[SI],zahl / 
MOV DL,array[BX][DI].

Programmieren tu ich nun 8086 mit dem TASM. Ich denke die 
Aufgabenstellung ist klar. Ich hab mir in i und j quasi die Koordinaten 
geschrieben an welcher Stelle ich das Element schreiben will und in zahl 
steht eben die Zahl die an die bestimmte Stelle im Array reinsoll. Mein 
Problem besteht jetzt nur noch darin die besagte zahl an die richtige 
Stelle in Abhängigkeit von i und j zu schreiben.

Ich weiß hier aber echt nicht weiter...

von Richards, Ben (Gast)


Lesenswert?

>MOV SI,[array[BX][DI]]
Der Befehl ist nicht gültig. Entweder nur das Displacement aus BX+DI 
ohne Konstante (array) oder jeweils BX oder DI mit Konstante.

>MOV WORD PTR[SI],zahl
Schreibt eine 16bit-konstante in die Speicherzelle mit dem SI-Register 
als Index.

>MOV DL,array[BX][DI]
wie 1.

Schön das mein beim Studium lernt, wie man Eingabe-Routinen mit 
Assembler programmiert. Schade um die Zeit.

von compilator (Gast)


Lesenswert?

Sieht für mich nach x86 real mode aus. Beschäftige dich mal mit 
Segment:Offset und zB dem LODS oder STOS Instruktion. Mit PTR weist du 
den Assembler darauf hin, dassdu indirekt adressieren willst. Die 
Indizes kannst du teilweise sogar mit Addition aufbohren. rtfm X86 
assembly, bei Intel halt mal runterladen und Kapitel zu real mode und 
MOV durcharbeiten.

von Tobias Mehrl (Gast)


Lesenswert?

@ Richards Ben:

Wie hast du das gemeint? "Schön das mein beim Studium lernt, wie man 
Eingabe-Routinen mit Assembler programmiert. Schade um die Zeit."

Irgendeinen Grund wird mein Prof schon haben, oder?

von Andreas (Gast)


Lesenswert?

Der hat kein bock neue Unterlagen zu erarbeiten ;-))

Gruß
Andreas

von Tobias Mehrl (Gast)


Lesenswert?

Aber was ist denn an assembler eingabe-routinen so falsch?

von Karl H. (kbuchegg)


Lesenswert?

Tobias Mehrl schrieb:
> Aber was ist denn an assembler eingabe-routinen so falsch?

Es ist eine sinnlose Aufgabe

Ausser Systemprogrammierern auf Treiberebene und eventuell noch ein paar 
Spieleprogrammierer in ihren innersten Kernfunktionen, programmiert kein 
Mensch mehr auf dem PC in Assembler. Bringt auch nix. Noch nicht einmal 
Geschwindigkeit. Dazu sind heutige CPU zu komplex mit ihren Pipelining 
Architekturen als das man als Neuling einen Compiler schlagen könnte.

Das ist ungefähr so, wie wenn du Altbabylonisch lernen würdest. Ausser 
ein paar Spezialisten braucht das kein Mensch mehr.

von Icke (Gast)


Lesenswert?

Fegt aber den Kalk aus der Gedächtnishalle.

zum Thema.

Die WORD PTR etc. Konstrukte braucht der Assembler da er bei Befehlen in 
denen kein Register Ziel oder Quelle die Größe nicht weiß.

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? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.