-2

私はTASMを使用しています。9より大きい2つの数値を入力して、この数値の合計を計算しようとしています。数値と合計を簡単に出力した後、;

そのように:

数値1=109 数値2=90 合計=199

この数値の換算方法と和の計算方法が知りたいです。9より大きい場合は、そのコードを使用して数字を入力します。ありがとう

MOV Numbre1,0
lecture: int 21h ; 
Cmp AL, "0"
JB fin
Cmp AL,"9"
JA fin
Sub AL,"0" 
SHL Numbre1,1 
Mov BL,Numbre1
SHL BL,1
Add Numbre1,BL
Add Numbre1,AL
jmp lecture
4

1 に答える 1

0

これは、これまでで最もよく聞かれる質問です。例が見つからない場合は、検索スキルをアップグレードしてください。

あなたが持っているものから...そのためにal(編集: ah!)のサブ関数が必要になりますint 21h。有効な 10 進数を正しくチェックします。10進数ではshl役に立ちません(ただし、16進数には役立つ可能性があります)。

コードが実行しているように見えるテキストから数値に変換するには、「これまでの結果」のレジスタをゼロにします。有効な 10 進数 (左から右への処理) を見つけるたびに、'0' (30h または 48 10 進数ですが、'0' の方が読みやすい) を減算し、「これまでの結果」に 10 を掛けて、新しい桁を追加します。完了するまで...

数値をテキストに変換して印刷できるようにするには、質問で実際に尋ねますが、10 で割ることを繰り返します。何を何でdiv割るかに注意してください。残り ( ahdx、または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 バイトに収まりますが、完全な単語を実行するのと同じくらい簡単です。

于 2013-01-15T19:30:28.543 に答える