アセンブリ(二)
5355 ワード
今回のプログラミングの内容は、コンソールから簡単な文字列をアセンブリで入力し、その文字列をコンソールに表示することです.
文字列の入力をアセンブリで実現するのは簡単で、0 AH DOS呼び出しで済む
コードは次のとおりです.
(コード1)
上のコードでは、入力された文字列を格納するためのデータバッファbufferが開きます.注意データセグメントにおけるbufferバッファの定義:最初のバイトは81で格納され、格納された最大バイト数(リターンを含む)を示す.2番目のバイトは、実際にこのバッファに格納されているバイト数を表します.3バイト目から始まるまで、入力文字列を本当に格納する開始位置です.13、14、15行は、コンソールから文字列を入力し、バッファbufferに保存することを実装する.
上はアセンブリで実現された文字列の読み込みです.では、入力した文字列をdos呼び出しで表示するにはどうすればいいのでしょうか.自分で入力した文字列を表示するには、いくつかの詳細に注意する必要があります.
まず、データセグメントで定義された文字列を表示する方法を見てみましょう.簡単でdos呼び出しで解決します.
(コード2)
上記のコードは、まずデータ・セグメントに文字列bufferを定義し、$で終わります(ここで注意).その後bufferのヘッダアドレスをdxに渡し、09 H号DOS呼び出しを呼び出すと画面に文字列が表示されます.もちろん,上記のコードを見ると,直接両者を組み合わせることで文字列入力を実現し,入力したばかりの文字列を表示する機能が考えられる.しかし,コード1に文字列が入力されて終了すると,12,13,14行のコードがそのまま後に続くと,画面に表示される文字化けしていることがわかる.
これが細部の場所です.まず、コード1のbufferヘッダは文字列のヘッダではなく、次に、文字列を入力するとbufferもドル$記号で終わるわけではありません.したがって、入力した文字列を出力するには、1、文字列のヘッダアドレスをdxにするのは簡単で、mov dx、buffer[2]でよい.2、入力された文字列には、実際に入力された文字列に基づいて計算する必要があります.例えば、3文字を入力した場合、bufferの下に5と表記された位置に$記号を挿入する必要がありますが、実はmov buffer[7],'$'を実行すればよいのです.
完全な実装は次のとおりです.
文字列の入力をアセンブリで実現するのは簡単で、0 AH DOS呼び出しで済む
コードは次のとおりです.
(コード1)
1 stack segment stack
2 db 2014 dup(?)
3 stack ends
4 data segment
5 buffer db 81,0,81 dup(0)
6 data ends
7 code segment 'code'
8 assume cs:code,ds:data,ss:stack
9 start:
10 mov ax,data
11 mov ds,ax
12
13 mov ah,0AH
14 mov dx,offset buffer
15 int 21H
16
17 code ends
18 end start
上のコードでは、入力された文字列を格納するためのデータバッファbufferが開きます.注意データセグメントにおけるbufferバッファの定義:最初のバイトは81で格納され、格納された最大バイト数(リターンを含む)を示す.2番目のバイトは、実際にこのバッファに格納されているバイト数を表します.3バイト目から始まるまで、入力文字列を本当に格納する開始位置です.13、14、15行は、コンソールから文字列を入力し、バッファbufferに保存することを実装する.
上はアセンブリで実現された文字列の読み込みです.では、入力した文字列をdos呼び出しで表示するにはどうすればいいのでしょうか.自分で入力した文字列を表示するには、いくつかの詳細に注意する必要があります.
まず、データセグメントで定義された文字列を表示する方法を見てみましょう.簡単でdos呼び出しで解決します.
(コード2)
1 stack segment stack
2 db 2014 dup(?)
3 stack ends
4 data segment
5 buffer db ‘hello world!’,'$'
6 data ends
7 code segment 'code'
8 assume cs:code,ds:data,ss:stack
9 start:
10 mov ax,data
11 mov ds,ax
12 mov ah,09H
13 mov dx,offset buffer
14 int 21H
15
16 code ends
17 end start
上記のコードは、まずデータ・セグメントに文字列bufferを定義し、$で終わります(ここで注意).その後bufferのヘッダアドレスをdxに渡し、09 H号DOS呼び出しを呼び出すと画面に文字列が表示されます.もちろん,上記のコードを見ると,直接両者を組み合わせることで文字列入力を実現し,入力したばかりの文字列を表示する機能が考えられる.しかし,コード1に文字列が入力されて終了すると,12,13,14行のコードがそのまま後に続くと,画面に表示される文字化けしていることがわかる.
これが細部の場所です.まず、コード1のbufferヘッダは文字列のヘッダではなく、次に、文字列を入力するとbufferもドル$記号で終わるわけではありません.したがって、入力した文字列を出力するには、1、文字列のヘッダアドレスをdxにするのは簡単で、mov dx、buffer[2]でよい.2、入力された文字列には、実際に入力された文字列に基づいて計算する必要があります.例えば、3文字を入力した場合、bufferの下に5と表記された位置に$記号を挿入する必要がありますが、実はmov buffer[7],'$'を実行すればよいのです.
完全な実装は次のとおりです.
1 stack segment stack
2 db 2014 dup(?)
3 stack ends
4 data segment
5 buffer db 81,0,81 dup (?)
6 data ends
7 code segment 'code'
8 assume cs:code,ds:data,ss:stack
9 start:
10 mov ax,data
11 mov ds,ax
12 mov ah,09H
13 mov dx,offset buffer
14 int 21H
15 mov bx,2 ; bx
16 mov al,buffer[1] ; al
17 cbw ; al
18 add bx,ax ; bx ax ,
19 mov buffer[bx],'$' ; $
20 mov ah,02H ;
21 mov dl,0dh
22 int 21H
23 mov dl,0Ah
24 int 21H
25 mov dx,offset buffer[2] ; dx
26 mov ah,09H ;dos
27 int 21H
28 mov ah,4cH ; dos
29 int 21H
30 code ends
31 end start