11

私の情報はここから来ています。この割り当てでは、20 文字以内で読み取り、それらの文字を大文字に変換し、入力を大文字として出力するプログラムを要求します。

int21/AH=0ah からの入力にアクセスする方法がわかりません。上記のリンクを理解しない限り、これ以上正確な質問をすることはできません。誰か説明できますか?また、違いがある場合はTASMを使用しています。また、これをfreedosでテストしています。

更新1:

わかりました、あなたの助けのおかげで、割り込みを設定する必要があり、動作する方法を理解できたと思います.

セットアップ: このバッファを存在させたい ds:dx を指定する必要があります

ds:dx を 20 に設定する必要があります (これにより、バッファーが保持できる最大文字数が設定されます)

ds:dx+1 を 0 に設定する必要があります (これにより、読み込む最小文字数を何らかの方法で設定できると思います)。

実際に int21/AH=0ah を呼び出します。これは ds:dx に移動し、プリセット バイトを解釈します。入力を待っている間、プログラムを停止します

int21/AH=0ah は ds:dx+2+n から私の入力を埋めます (n は '\r' を含む入力文字数です)

私の質問は今、どうすればこれを行うことができるかです。x86 Assembly Language Reference をもう一度調べましたが、まだ役立つものを見つけることができませんでした。

これまでに入手したコード

           assume          cs:code,ds:code
code       segment
start:

           mov  ax,code ;moves code segment into reg AX
           mov  ds,ax   ;makes ds point to code segment

           mov  ah,0ah
           int  21h
           mov  ax,1234h  ;breakpoint

           mov  ah,9
           mov  dx,offset message
           int  21h

endNow:
           ;;;;;;;;;;ends program;;;;;;;;;;
           mov  ah,0  ;terminate program
           int  21h   ;program ends

message    db   'Hello world!!!',13,10,'$'
code       ends
           end  start
4

3 に答える 3

9

その DOS 関数は、ユーザー入力でバッファーを取得します。このを参照してください。プログラムがその呼び出しを使用して実行を一時停止し、ユーザーがプログラムを再開するのを待っているようです。

編集:質問を読み直しました。指定されたソースで関数呼び出しが何をしたかを尋ねているだけだと思いました。20 文字以下の入力を読み取りたい場合は、まずそれを格納するためのメモリが必要です。次のようなものを追加します。

bufferSize  db 21  ; 20 char + RETURN
inputLength db 0   ; number of read characters
buffer      db 21 DUP(0) ; actual buffer

次に、バッファーを埋めます。

mov ax, cs
mov ds, ax ; ensure cs == ds
mov dx, offset bufferSize ; load our pointer to the beginning of the structure
mov ah, 0Ah ; GetLine function
int 21h

大文字に変換する方法は読者に任されています。

于 2012-11-03T06:33:02.173 に答える
2

ds:dxその説明は、割り込みを呼び出す前にバッファのアドレスを入れたと言っています。割り込みは、読み取った文字でそのバッファを埋めます。

割り込みを呼び出す前に、バッファーの最初のバイトは、バッファーが保持できる文字数、またはこの場合は 20 です。バッファの 2 番目のバイト (割り込みへの入力時) の説明がわからないので、0 に設定します。返されると、そのバイトは、入力の何文字が読み取られてバッファに配置されたかを示します。

于 2012-11-03T06:47:37.093 に答える