2016-05-02 9 views
-2

2つの32ビットの数値を画面に読み込み、保存し、印刷し、結果を掛けて印刷する必要があります。32ビットアーキテクチャ上で2つの10桁の32ビットの数値を掛ける

私は2つの数字の数字を読み、それを印刷することができましたが、十分に大きければ、それらがオーバーフローして、事実は言及せず、それらを掛けなければなりません。 64ビットレジスタ。私は "倍精度の算術"のものを見つけましたが、それを実装することはできませんでした。私はeax:edxレジスタを使用しなければならないことを知っています。キャリービットについても読んでいますが、まだそれの本質を理解することはできません。 (MASM、32ビットシステム)

コード私はこれまで持っている:

INCLUDE Irvine32.inc 
.data 

NUM1  BYTE ? 
NUM2  BYTE ? 
NUM3  BYTE ? 
NUM4  BYTE ? 
NUM5  BYTE ? 
NUM6  BYTE ? 
NUM7  BYTE ? 
NUM8  BYTE ? 
NUM9  BYTE ? 
NUM10 BYTE ? 

NUMA  BYTE ? 
NUMB  BYTE ? 
NUMC  BYTE ? 
NUMD  BYTE ? 
NUME  BYTE ? 
NUMF  BYTE ? 
NUMG  BYTE ? 
NUMH  BYTE ? 
NUMI  BYTE ? 
NUMJ  BYTE ? 

SZAM1 DWORD 0 
SZAM2 DWORD 0 
SZAMOL DWORD 0 



.code 
main proc 

elso: 
    call ReadChar 
    mov NUM1,al 
    call WriteChar 
    cmp AL,13 
    JE masodik 
    call ReadChar 
    mov NUM2,al 
    call WriteChar 
    cmp AL,13 
    JE masodik 
    call ReadChar 
    mov NUM3,al 
    call WriteChar 
    cmp AL,13 
    JE masodik 
    call ReadChar 
    mov NUM4,al 
    call WriteChar 
    cmp AL,13 
    JE masodik 
    call ReadChar 
    mov NUM5,al 
    call WriteChar 
    cmp AL,13 
    JE masodik 
    call ReadChar 
    mov NUM6,al 
    call WriteChar 
    cmp AL,13 
    JE masodik 
    call ReadChar 
    mov NUM7,al 
    call WriteChar 
    cmp AL,13 
    JE masodik 
    call ReadChar 
    mov NUM8,al 
    call WriteChar 
    cmp AL,13 
    JE masodik 
    call ReadChar 
    mov NUM9,al 
    call WriteChar 
    cmp AL,13 
    JE masodik 
    call ReadChar 
    mov NUM10,al 
    call WriteChar 
    cmp AL,13 
    JE masodik 



masodik: 
    Call Crlf 
    call ReadChar 
    mov NUMA,al 
    call WriteChar 
    cmp AL,13 
    JE konvertal 
    call ReadChar 
    mov NUMB,al 
    call WriteChar 
    cmp AL,13 
    JE konvertal 
    call ReadChar 
    mov NUMC,al 
    call WriteChar 
    cmp AL,13 
    JE konvertal 
    call ReadChar 
    mov NUMD,al 
    call WriteChar 
    cmp AL,13 
    JE konvertal 
    call ReadChar 
    mov NUME,al 
    call WriteChar 
    cmp AL,13 
    JE konvertal 
    call ReadChar 
    mov NUMF,al 
    call WriteChar 
    cmp AL,13 
    JE konvertal 
    call ReadChar 
    mov NUMG,al 
    call WriteChar 
    cmp AL,13 
    JE konvertal 
    call ReadChar 
    mov NUMH,al 
    call WriteChar 
    cmp AL,13 
    JE konvertal 
    call ReadChar 
    mov NUMI,al 
    call WriteChar 
    cmp AL,13 
    JE konvertal 
    call ReadChar 
    mov NUMJ,al 
    call WriteChar 
    cmp AL,13 
    JE konvertal 

konvertal: 
    Call Crlf 

    sub NUM1, '0' 
    sub NUM2, '0' 
    sub NUM3, '0' 
    sub NUM4, '0' 
    sub NUM5, '0' 
    sub NUM6, '0' 
    sub NUM7, '0' 
    sub NUM8, '0' 
    sub NUM9, '0' 
    sub NUM10, '0' 

    sub NUMA, '0' 
    sub NUMB, '0' 
    sub NUMC, '0' 
    sub NUMD, '0' 
    sub NUME, '0' 
    sub NUMF, '0' 
    sub NUMG, '0' 
    sub NUMH, '0' 
    sub NUMI, '0' 
    sub NUMJ, '0' 

szamkiiras1: 
    mov al,NUM10 
    movzx eax,al 
    imul eax,1 
    add SZAM1,eax 

    mov al,NUM9 
    movzx eax,al 
    imul eax,10 
    add SZAM1,eax 

    mov al,NUM8 
    movzx eax,al 
    imul eax,100 
    add SZAM1,eax 

    mov al,NUM7 
    movzx eax,al 
    imul eax,1000 
    add SZAM1,eax 

    mov al,NUM6 
    movzx eax,al 
    imul eax,10000 
    add SZAM1,eax 

    mov al,NUM5 
    movzx eax,al 
    imul eax,100000 
    add SZAM1,eax 

    mov al,NUM4 
    movzx eax,al 
    imul eax,1000000 
    add SZAM1,eax 

    mov al,NUM3 
    movzx eax,al 
    imul eax,10000000 
    add SZAM1,eax 

    mov al,NUM2 
    movzx eax,al 
    imul eax,100000000 
    add SZAM1,eax 

    mov al,NUM1 
    movzx eax,al 
    imul eax,1000000000 
    add SZAM1,eax 

    mov eax,SZAM1 
    call WriteInt 

szamkiiras2: 
    Call Crlf 
    mov al,NUMJ 
    movzx eax,al 
    imul eax,1 
    add SZAM2,eax 

    mov al,NUMI 
    movzx eax,al 
    imul eax,10 
    add SZAM2,eax 

    mov al,NUMH 
    movzx eax,al 
    imul eax,100 
    add SZAM2,eax 

    mov al,NUMG 
    movzx eax,al 
    imul eax,1000 
    add SZAM2,eax 

    mov al,NUMF 
    movzx eax,al 
    imul eax,10000 
    add SZAM2,eax 

    mov al,NUME 
    movzx eax,al 
    imul eax,100000 
    add SZAM2,eax 

    mov al,NUMD 
    movzx eax,al 
    imul eax,1000000 
    add SZAM2,eax 

    mov al,NUMC 
    movzx eax,al 
    imul eax,10000000 
    add SZAM2,eax 

    mov al,NUMB 
    movzx eax,al 
    imul eax,100000000 
    add SZAM2,eax 

    mov al,NUMA 
    movzx eax,al 
    imul eax,1000000000 
    add SZAM2,eax 

    mov eax,SZAM2 
    call WriteInt 

szorzas: 
    Call Crlf 
    mov SZAM1,eax 
    mov SZAM2,ebx 
    imul eax,ebx 
    call WriteInt 

main endp 

end main 
+0

これまでに得たコードを確認できますか? –

+0

もちろん、申し訳ありませんが、今の説明にあります。 – Tomi

+0

'mov eax、1FFFFFFFh mov ebx、1FFFFFFFh'、' mul ebx'の場合、結果はEDX:EAXにあり、EDX = '3FF FFFF'、EAX =' C000 0001'のように '3FF FFFF C000 0001'のようになります。 –

答えて

0

小学校から

(1^n)を*(1^M)= 1 ^(N + m)。したがって、2つの32ビット番号がある場合は、すべてのケースを処理するために結果として64ビットの番号が必要です。 x86は結果を2つのレジスタに格納することをサポートし、一方は上半分を取得し、他方は上半分を取得します。 x86命令セットのドキュメントを読んでください。

オペランドの結果の2倍のビットを許す限り、最悪の場合の数値が収まるため、フラグを心配する必要はありません。結果を取得するだけです。

オペランドの幅の2倍の結果を処理しないアーキテクチャの場合。再び、小学校の数学を使い、問題を複数のステップに分けてください。 abcd * efghの32ビットの数値を16ビットの数値に分解し、手で行うのと同じように乗算を行うことができます。 gh * cd、gh * ab、ef * cd、ef * ab。次に、適切なシフトと加算を行い、それらの結果を答えに組み込みます。

Iは16ビットの16進数0xABCDと* 0x1234の答えが((0xABCDと* 4)< < 0)+((0xABCDと* 3)< < 4)+であった場合((0xABCDとを* 2)< < 8) +((0xabcd * 1)< < 12)

上記のように一度に4ビット、またはハードウェアの種類によっては8または16にすることもできます。バイナリでの乗算が非常にシンプルであることに気づいた場合、数字をシフトして追加するか、または追加しないでください)。そして、これはあなたが望むように拡大します.1百万ビット数* 1百万ビット数= 200万ビット数です。より小さな乗算とシフトを行うだけの問題です。

これは私たちが小学校でやっていたことです。一番下に一桁ずつ、一番上にそれを乗じていくつかの場所に移動します。これをソフトウェア(ほとんどの言語)で実装することができます。シフトや追加を使用することも、ハードウェアの乗算を使用して、ある程度容量を増やすこともできます。

+0

多くのアーキテクチャでは、拡大倍率または乗算の上半分を計算する命令が提供されています。 – EOF

+0

アルファ: 'UMULH'。 POWER:MULH [U/S]、MIPS: 'MUL/MULT [U]/[D] MULH [U]'、x86(-64): 'MUL/IMUL/MULX'。基本的には、私が見つけることができるあらゆる汎用アーキテクチャにはそのような指示があります。 – EOF

関連する問題