これは、これまでで最もよく聞かれる質問です。例が見つからない場合は、検索スキルをアップグレードしてください。
あなたが持っているものから...そのためにal
(編集: ah
!)のサブ関数が必要になりますint 21h
。有効な 10 進数を正しくチェックします。10進数ではshl
役に立ちません(ただし、16進数には役立つ可能性があります)。
コードが実行しているように見えるテキストから数値に変換するには、「これまでの結果」のレジスタをゼロにします。有効な 10 進数 (左から右への処理) を見つけるたびに、'0' (30h または 48 10 進数ですが、'0' の方が読みやすい) を減算し、「これまでの結果」に 10 を掛けて、新しい桁を追加します。完了するまで...
数値をテキストに変換して印刷できるようにするには、質問で実際に尋ねますが、10 で割ることを繰り返します。何を何でdiv
割るかに注意してください。残り ( ah
、dx
、またはedx
に応じて) は 10 進数です。それぞれに「0」を追加します。右から左に数字を取得し、左から右に印刷したい - これに対処するにはいくつかの方法があります...
例を見つけるか、デバッガーを起動して解決してください。プログラムがクラッシュする最も可能性の高い理由は、何を何でdiv
割るかに注意を払っていないことです! 具体的なお悩みをお聞かせください...
編集:ため息...
mov ax, the_number
xor cx, cx ; digit counter
mov bx, 10
pushem:
xor dx, dx ; important!
div bx ; quotient in ax, remainder in dx
add dl, '0' ; convert to character
push dx ; save 'em to get back in right order
inc cx ; count 'em
test ax, ax ; done?
jnz pushem ; no, do more
popem:
pop ax ; we're only interested in al
int 29h ; print al
loop popem ; until done
これは私が知っている最も簡単な方法です (おそらく「最善」ではありません)。現在の数字のセットは 1 バイトに収まりますが、完全な単語を実行するのと同じくらい簡単です。