2016-03-28 1 views
-1

Je travaille dans emu8086 version 4.08. Je dois créer une base de données d'étudiants. Donc, si je veux stocker une liste de noms ou d'ID dans un tableau de chaînes, comment puis-je le faire? ou y a-t-il un autre moyen? Merci d'avance.Comment déclarer et manipuler un tableau de chaînes dans le langage d'assemblage 8086?

Voici le code que je suis en train:

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

Comment voulez-vous allez-vous stocker des notes dans un tableau de nombres? Pensez-y et voyez si cela vous met dans la bonne direction. Quoi qu'il en soit, vous devriez inclure un code de programmation dans votre question afin que nous puissions apprécier ce que vous savez ou ne savez pas. –

+1

@SepRoland J'ai modifié le message et ajouté le code. tout en émulant il dit, "ne peut pas convertir en valeur de 16 bits:" student1 $ "" et même pour toutes les chaînes. –

+0

Pouvez-vous ajouter à votre question ce qu'est réellement votre devoir? Du code, il n'est pas tout à fait clair quels sont les paramètres de la question. Mais comme il se trouve des choses comme 'mov str2 [si]," student1 $ "' ne fonctionnera pas. Vous ne déplacez pas les chaînes avec 'mov', mais vous pouvez déplacer les adresses des chaînes. –

Répondre

2
mov str2[si],"student1$" 

Vous avez tort dans ce que signifie SI. Vous pensez que c'est un index dans le tableau, mais ce n'est pas le cas. En langage assembleur, il s'agit d'un décalage en mémoire (mesuré en octets).

La chaîne "student1 $" a caractères et vous devez donc fournir de la place pour stocker tous ces caractères, 1 octet par caractère. De plus, vous ne pouvez pas attribuer la chaîne complète en une fois. Vous devrez utiliser une boucle pour cela.


d'abord changer la définition du tableau et stocker le nom dans un endroit tempory:

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

Cela donnera la place pour stocker 4 noms des élèves de 9 caractères plus un caractère de fin supplémentaire (si on le souhaite).


Suivant En utilisant une boucle pour écrire un nom d'étudiant:

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

Pour le prochain étudiant le nom devra être écrit à str2 + 10

+1

Je crois que 'name' est un mot réservé emu8086. Vous pourriez vouloir le renommer en 'sname' (nom de l'étudiant). De plus, étant donné que emu8086 est similaire à la syntaxe _MASM_, ces 2 lignes ne fonctionneront pas: 'mov di, str2'' mov si, name' car ils tentent tous deux de récupérer ce qui est AT adresse mémoire de 'str2' et' name' et pas les adresses elles-mêmes. Vous aurez besoin du décalage des étiquettes, il devrait donc être 'mov di, offset str2'' mov si, offset sname'. Je pense que emu8086 exige que votre définition de tableau soit quelque chose comme 'str2 db 4 * 10 dup (0)' –

+1

Vous avez raison. Cela fait un moment que j'ai utilisé emu8086 en raison de sa bizarrerie. –