2016-03-28 16 views
-1

Ich arbeite in emu8086 Version 4.08. Ich muss eine Studenten-Datenbank erstellen. Also, wenn ich eine Liste von Namen oder ID in einem Array von Strings speichern möchte, wie kann ich es tun? oder gibt es einen anderen Weg? Danke im Voraus. HierWie deklariert und manipuliert man ein Array von Strings in 8086 Assembler?

ist der Code, den ich versuche:

include 'emu8086.inc' 

.model small 
.stack 100h 


.data 


    str2 dw 20 dup('$') 

.code 

    mov ax,@data 
    mov ds,ax 

main proc 



    mov si,0 





    mov str2[si],"student1$" 
    add si,1 

    mov str2[si],"student2$" 
    add si,1 

    mov str2[si],"student3$" 
    add si,1 

    mov str2[si],"student4$" 



mov ah,4ch 
int 21h    

endp main 


DEFINE_SCAN_NUM 
DEFINE_PRINT_STRING 
DEFINE_PRINT_NUM 
DEFINE_PRINT_NUM_UNS 
DEFINE_PTHIS 
+2

Wie würden Sie geschrieben werden müssen gehen Sie darum, Noten in einer Reihe von Zahlen zu speichern? Denken Sie darüber nach und sehen Sie, ob es Sie in die richtige Richtung bringt. Wie auch immer, Sie sollten Programmiercode in Ihre Frage aufnehmen, damit wir wissen, was Sie wissen oder nicht wissen. –

+1

@SepRoland Ich habe den Post bearbeitet und den Code hinzugefügt. Während der Emulation heißt es, "kann nicht in 16-Bit-Wert konvertiert werden:" student1 $ "" und dasselbe für alle Strings. –

+0

Kannst du deiner Frage hinzufügen, was deine Hausaufgabe eigentlich ist? Aus dem Code ist nicht ganz klar, was die Parameter der Frage wirklich sind. Aber wie es aussieht, werden Dinge wie 'mov str2 [si], 'student1 $" 'nicht funktionieren. Sie verschieben keine Zeichenfolgen mit 'mov', aber Sie können die Adressen von Zeichenfolgen verschieben. –

Antwort

2
mov str2[si],"student1$" 

Du irrst dich in was SI steht. Sie denken, dass es ein Index im Array ist, ist es aber nicht. In der Assemblersprache ist es ein Offset im Speicher (gemessen in Bytes).

Die Zeichenfolge "student1 $" hat Zeichen und so müssen Sie Raum für die Speicherung aller dieser Zeichen, 1 Byte pro Zeichen. Außerdem können Sie den kompletten String nicht auf einmal vergeben. Sie müssen dafür eine Schleife verwenden.


Zuerst die Definition des Arrays ändern und speichern Sie den Namen in einem tempory Ort:

str2 db 4*10 dup(0) 
sname db "student1$" 

Dies wird Raum geben für die Speicherung von 4 Schülernamen von 9 Zeichen plus eine zusätzliche Abschlusszeichen (wenn gewünscht).


Next eine Schleife verwenden, um einen Studentennamen zu schreiben:

mov di, offset str2 
mov si, offset sname 
More: 
mov al, [si] 
mov [di], al 
inc si 
inc di 
cmp al, "$" 
jne More 

Für den nächsten Schüler wird der Name in str2 + 10

+1

Ich glaube, dass 'name' ein emu8086 reserviertes Wort ist. Vielleicht möchten Sie es umbenennen in 'sname' (Name des Schülers). Da emu8086 der _MASM_Syntax ähnlich ist, funktionieren diese 2 Zeilen nicht: 'mov di, str2'' mov si, name', da beide versuchen, die AT-Speicheradresse von 'str2' und' name' abzufragen und nicht die Adressen selbst. Du wirst den Offset der Labels haben wollen, also sollte es 'mov di, offset str2'' mov si, offset sname' sein. Ich denke, dass emu8086 erfordert, dass Ihre Array-Definition etwas wie "str2 db 4 * 10 dup (0)" –

+1

ist. Sie haben Recht. Es ist eine Weile her, dass ich emu8086 benutzt habe, weil es so skurril ist. –