あなたは数字を印刷しようとしている場合、あなたのコードが間違っている。
INT 21h, AH=2
はASCII characterを出力します。DLへのオフセット値を入れているどのようなあなたのコードがやっている。DOSの代わりにASCII文字と出力としてオフセット値をその扱います。
たとえば、最初の非ゼロ要素のオフセットが7であるとします。コードでINT 21h, AH=2
をDL=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への変換ルーチンを実装する必要があるため、より複雑です。しかし、それを行うことができるコードサンプルがたくさんあります。
なぜ現在のカウントを保存する必要がありますか? –
print_offsetの後に次の配列要素に実行が続きます。 INT 21がcxレジスタを変更した場合、カウント値(まだ使用している)は間違っています。 – adelphus
私は参照してください。では、cxとsiはどこに押し込まれますか?彼ら自身のcx []とsi []配列? –