2016-12-05 2 views
0

DOSアセンブリでユーザー入力を取得しようとしていますが、DSとDXを設定する方法を頭に入れていないようです正しい場所への書き込みを中断します。私のメインファイルのコードは次のとおりです。DSを設定し、DOSでAH = 0Ahを使用する

BITS 16 
org 0x100 

Start: 

; SNIP 

mov dx, Name 
call GetString 

; SNIP 

Exit: 
mov ax, 0x4c00 
int 0x21 

Name: 
     db 33 
     db 0 
     times 255 db 0 

そして、ここに別のファイルからの私のGetStringプロシージャがあります。私はそれが動作しない理由を得るように見えることはありません

GetString: 
push ax 
push bx 
; syscall 
mov ax, 0x0a 
int 0x21 
mov bx, dx ; move buffer to adressing register 
inc bx ; get number of chars read 
movzx si, [bx] ; put bx's value (numbers of chars read) into si 
inc bx ; get actual string buffer 
add si, bx ; number of chars read + buffer = last byte 
mov byte [si], '$' ; $ terminate 
mov dx, bx 
pop bx 
pop ax 
ret 

:私はそれは関数が呼び出される前に、DXが設定されることを期待して、実際の文字列の先頭を指してDXを残すようにすることを意図しました。私は何かにDSを設定すると思いますか? GetString

+2

「機能しません」というのは良い問題の説明ではありません。何が起こり、どうやって間違っているのか分かりますか? – Jester

+1

".com"実行可能ファイルのように見えます。ここでは、すべてのデータとコードとスタックは単一セグメントにあり、コードは '0x0100'から始まります。だから、コードの始めに、 'cs'を' ds'にコピーする 'push cs'' pop ds'を実行することができます。これは" .com "(" .exe "ではなく)で使えるはずです。 – Ped7g

+1

一部のアセンブラでは、 'MOV AX、@ DATA; MOV DS、AX' .exeファイルをアセンブルします。 –

答えて

4

あなたはこれが00ah0ahal)をロードし、呼び出しは "プログラムを終了" である21h機能00hを中断

mov ax, 0x0a 
int 0x21 

を持っています。

あなたが「バッファリングSTDIN入力」機能0ahを呼び出すためのものならば、あなたは、あなたが持っているように、initiliasedバッファを指しDS:DXとともに

mov ah, 0x0a 
int 0x21 

を必要としています。

関連する問題