2016-03-28 15 views
-1

私はemu8086バージョン4.08で作業しています。私は学生データベースを作る必要があります。ですから、文字列の配列に名前やIDのリストを格納するにはどうしたらいいですか?または他の方法がありますか?前もって感謝します。8086アセンブリ言語で文字列の配列を宣言して操作する方法は?

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

に書き込まなければならないであろう次の学生のため

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

をどのようにでしょうグレードを数字の配列に格納するのはどうですか?これについて考えて、あなたが正しい方向に向かうかどうかを見てください。とにかく、知っているか分からないことを理解できるように、プログラミングコードを質問に含める必要があります。 –

+1

@SepRoland投稿を編集してコードを追加しました。それをエミュレートすると「16ビット値に変換できません:student1 $」とすべての文字列で同じです。 –

+0

あなたの宿題が実際にどのようなものであるか質問に追加できますか?コードから、質問のパラメータが本当に何であるかは完全にはっきりしていません。しかし、 'mov str2 [si] 'のようなものであるため、student1 $" 'は動作しません。 'mov 'で文字列を移動するのではなく、文字列のアドレスを移動することができます。 –

答えて

2
mov str2[si],"student1$" 

をあなたはSIが何の略かで間違っている:ここで

は、私がしようとしているコードです。あなたはそれが配列内のインデックスだと思っていますが、そうではありません。アセンブリ言語では、メモリ内のオフセット(バイト単位)です。

"student1 $"という文字列には文字が含まれているため、1文字あたり1バイトの文字をすべて格納するスペースを確保する必要があります。さらに、完全な文字列を一度に割り当てることはできません。それにはループを使用する必要があります。


最初の配列の定義を変更し、tempory場所に名前を格納しますたい場合

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

はこれが9つの文字に加えて、余分な終端文字(の4人の学生の名前を保存するための余地を与えます)。


次は生徒の名前を書くためにループを使用します。名前はSTR2 + 10

+1

私は 'name'はemu8086の予約語だと信じています。 'sname'(学生名)に名前を変更したいかもしれません。同様に、emu8086が_MASM_構文に似ていることを考えると、これらの2行は動作しません: 'mov di、str2'' mov si、name'は 'str2'と' name'のATメモリアドレスを取得しようとします。アドレスそのものではありません。ラベルのオフセットは 'mov di、offset str2''' mov si、offset sname'にする必要があります。私はemu8086が 'str2 db 4 * 10 dup(0)' –

+1

のような配列定義を必要とすると思います。私がemu8086を使ったのはとても奇妙なので、しばらくお待ちください。 –

関連する問題