2012-02-24 16 views
0

オフセット値を印刷しようとしています。 (「記録」修正は?それのための別の用語がありますかアセンブリ:オフセット値を印刷する方法

は正しいコードですか?私は、アセンブリのドキュメントではなく、混乱しています。

print_offsets: mov SI,0 
       mov CX,30 
       mov AH,2 
       int 21h 
       jmp offsloop 

offsloop:  cmp 0,Array[SI] 
       ja print_offset ;if the array element is nonzero 
       inc SI 
       dec CX 
       jnz offsloop 

print_offset: mov DL,SI 
       mov AH,2 
       int 21h 

答えて

0

あなたは数字を印刷しようとしている場合、あなたのコードが間違っている。

INT 21h, AH=2ASCII characterを出力します。DLへのオフセット値を入れているどのようなあなたのコードがやっている。DOSの代わりにASCII文字と出力としてオフセット値をその扱います。

たとえば、最初の非ゼロ要素のオフセットが7であるとします。コードでINT 21h, AH=2DL=07と呼びます。 DOSはBEL(基本的にシステムビープ音)であるASCII文字07hを出力します。代わりに、おそらくDL=37hが7桁の数字を表すASCII文字37hを出力する必要があります。

これを解決するにはいくつかの方法があります。

最初の方法は簡単です - あなたの配列が10個の以上の要素を持ったことがない場合、あなたは単に正しいASCII文字値にオフセット値を変換するために、オフセットに30Hを追加することができます。

print_offsets: mov SI,0   ; SI=offset 
       mov CX,10   ; CX = count (must be <= 10!!!!) 

offsloop:  cmp 0,Array[SI] 
       ja print_offset ;if the array element is nonzero 
next_element: inc SI 
       dec CX 
       jnz offsloop 
       jmp finished 

print_offset: mov DL,SI 
       add DL, 30h  ; convert offset to ASCII digit 0..9 
       mov AH,2 
       ; save the registers in case INT 21h modifies them! 
       push cx   ; save current count 
       push si   ; save current offset 
       int 21h 
       pop si   ; restore current offset 
       pop cx   ; restore current count 
       jmp next_element 
finished: 
       ; do something else! 

第二の方法を完全な整数からASCIIへの変換ルーチンを実装する必要があるため、より複雑です。しかし、それを行うことができるコードサンプルがたくさんあります。

+0

なぜ現在のカウントを保存する必要がありますか? –

+0

print_offsetの後に次の配列要素に実行が続きます。 INT 21がcxレジスタを変更した場合、カウント値(まだ使用している)は間違っています。 – adelphus

+0

私は参照してください。では、cxとsiはどこに押し込まれますか?彼ら自身のcx []とsi []配列? –

関連する問題