2012-03-29 14 views
1

私は次の割り当てを持っています:アセンブリ内の電卓

計算機の機能を実行するための完全な8086プログラムを書く:ADD/SUB/DIV/MUL。 ユーザーが「=」を押すと、プログラムは結果を表示するはずです。 0-9の数字のみが入力されます。

ones db ? 
    tens db ? 

    mov ah,1 
    int 21h 
    add al,30H 
    mov tens, al 
    mov ah,1  
    int 21H 
    mov dl,al 
    cmp dl, '+' 
    je addition 

addition: 
    mov ah,1  
    int 21h 
    mov bl,al 
    mov ones,al 

私はそれを差し引いた後、各番号に30hを追加することによって、それをしなければなりません。誰かが私がこれをどうやってできるのか説明できますか?

+0

宿題には宿題とタグ付けする必要があります:) – DipSwitch

+1

_各番号に30hを加えてそれを行う必要があります。それを誰かが私に説明することができますか?_←何かがあなたにそのコードを書かなかったと伝えます。 – ninjalj

答えて

2

0x30はASCIIの0サインです。したがって、0〜9の間の数字を印刷する場合は、値に0x30を加えて '0'文字にする必要があります。あなたは、端末から読み取る場合は、0x30の代わりの0を読んでいましたので、あなたはそれで計算をしたい場合は、「0」文字

http://en.wikipedia.org/wiki/ASCII

+0

笑、ここに新しい、しかし、ありがとう:) – lana

+1

@ラナ、これはあなたの質問に答える場合は、その隣にあるチェックマークをクリックする必要があります。 –

1

0値しようとする書き込みを変換するために、0x30からを減算する必要がありますそれはC言語やその他の言語で書かれています。

あなたはASCII値をとり、ASCII値を吐き出していると思いますか?

0 0b00110000 
1 0b00110001 
2 0b00110010 
3 0b00110011 
4 0b00110100 
5 0b00110101 
6 0b00110110 
7 0b00110111 
8 0b00111000 
9 0b00111001 

あなたが望んだ場合:ASCIIチャートで

ルックは、0のためのASCIIは、2進で、その上の0x32のです、そして、また、48またはバイナリ0b00110000 1が0x31である10進数の0x30のです数字9と8を追加するには、0x39と0x38ではなく、0x09と0x08をレジスタに追加します。 0x09の+ 0x08の= 0x11をます。0x39 + 0x38 =(0x71)を

0x11 0b00010001 
0x71 0b01110001 

あなたが何かを行う前に、ASCIIから変換いけない場合確実に結果から適切なビットを抽出することは難しいかもしれません。あなたはそれを通ってあなたの方法をハックすることができますが、乗算など、それはあまりにもかわいくなる可能性があります。あなた自身でこれを理解しなければなりません。

次に、バイナリ結果をasciiに戻す必要があります。結果をasciiで出力したいと思いますか?

ascii 0x31,0x37に小数点以下17桁の0x11からどうやって取得しますか?誰かが78インチに何フィートあるか尋ねると、答えは何ですか?あなたはフィートを12で割ることから始まり、6フィートの余りで6フィート、6フィート6インチに換算します。何時間、何分、何秒が4000秒ですか? 4000/3600 = 1残余400,400/60 = 6残余40,1:06:40。そして、もし私が123という数字を持っているのかどうか尋ねると、数学的に何百、何十ものものを抽出するのです(0x30をそれぞれASCIIに追加することができます)。

したがって、9と8を追加すると、0b00111001と0b00111000と入力としてプラス記号と等号が得られます。加算を行う前に0x00111001を0x00001001に、0x00111000を0x00001000に変更してから0x00010001を0x00000001に変更する必要があります0x00000111(ones)と0x00000001を0x00110001(ascii)に変更し、0x00000111を0x00110111(ones)(ascii)に変更してから印刷してください。