アセンブリ(二)

5355 ワード

今回のプログラミングの内容は、コンソールから簡単な文字列をアセンブリで入力し、その文字列をコンソールに表示することです.
文字列の入力をアセンブリで実現するのは簡単で、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