2017-02-01 10 views
0

学習目的のために、私はのいずれかをの整数除算でMARIEに書き込もうとしています。MARIE ASM Lang - 整数除算(正/負)

これは、XをYで剰余で除算するが正の整数のみで除算する標準(うまくいえば正しい)コードです。

 LOAD X 
     STORE REMAIN 
WHILE SUBT Y 
     SKIPCOND 800 
     JUMP CHECK 
DO  STORE REMAIN 
     LOAD RESULT 
     ADD ONE 
     STORE RESULT 
     LOAD REMAIN 
     JUMP WHILE 
CHECK SKIPCOND 400 
     JUMP END 
     STORE REMAIN 
     LOAD RESULT 
     ADD ONE 
     STORE RESULT 
END  HALT 
X  HEX XXXX 
Y  HEX YYYY 
RESULT HEX 0000 
REMAIN HEX 0000 
ONE  HEX 0001 

どのようにしてネガティブに機能させることができますか?おそらくいくつかのIFといくつかのビットマスクかもしれませんが、私はそれを正しく行う方法がわかりません。

答えて

1

する

    • 5/2 = [2,1](あなたは、このいずれかを有する)D/d=[q,r](配当/除数= [商、余り])...あなたはそれを定義する方法依存-5/-2 = [3,1]又は[2、-1](のx86方法)
    • 5/-2 = [-2、1](x86の)、または[-3、-1]
    • -5/2 = [-3,1]または[-2、-1](x86)

    (のx86 CPUでは、残りrの符号は常に配当Dの符号と同じである)

    あなたは以上の結果を見てみましょう場合は、それぞれの場合に絶対値が同じである:

    • | 5 |/| 2 | = [| 2 |、| 1 |]

    残りは被除数の符号を有し、商は配当XOR除数( -[+, -] == [-, +] ==VS [+, +] == [-, -] ==+)の符号を有します。

    あなたのルーチンの初めに、各値をテストし、肯定的か否定的かをフラグにしてプラスに変換して、あなたの部門を行い、その後現在では、ENDパッチ結果は旗によって。

    何かのようなものです(これはMarie Assemblyで初めてのことですので、ヒントのようにして、必要に応じて訂正してください。論理的なエラーもあるかもしれません。作品):!

    CLEAR 
        /init temporary/result variables to zero 
        STORE q_flag 
        STORE r_flag 
        STORE RESULT 
        SUBT  X    /try (-Dividend) value 
        SKIPCOND 800 
        JUMP  DividendWasPositive /positive or zero 
        STORE X    /(-Dividend) positive, rewrite original X 
        STORE q_flag   /set flags to positive value (X) 
        STORE r_flag 
    DividendWasPositive, 
        CLEAR 
        SUBT  Y    /try (-divisor) value 
        SKIPCOND 400 
        JUMP  DivisorNotZero 
        HALT     /division by zero detected, error 
    DivisorNotZero, 
        SKIPCOND 800 
        JUMP  DivisorWasPositive 
        STORE Y    /(-divisor) positive, rewrite original Y 
        /flip quotient flag value (zero <-> nonzero) ("nonzero" == X) 
        LOAD  X    /will not "flip" anything when 0 == X 
        SUBT  q_flag   /but then q = 0, so it's harmless deficiency 
        STORE q_flag   /q_flag is now zero or positive (X) value 
    DivisorWasPositive, 
        /here X and Y contain absolute value of input numbers 
        /q_flag is positive value when quotient has to be negated 
        /r_flag is positive value when remainder has to be negated 
    
        /.. do your division here .. 
    
        /patching results by the q/r flags from the prologue part 
    AdjustQuotientSign, 
        LOAD  q_flag 
        SKIPCOND 800 
        JUMP  AdjustRemainderSign 
        CLEAR 
        SUBT  RESULT 
        STORE RESULT   /quotient = -quotient 
    AdjustRemainderSign, 
        LOAD  r_flag 
        SKIPCOND 800 
        JUMP  SignsAdjusted 
        CLEAR 
        SUBT  REMAIN 
        STORE REMAIN   /remainder = -remainder 
    SignsAdjusted, 
        HALT 
    
    q_flag, DEC  0 
    r_flag, DEC  0 
    ... rest of your variables 
    

    その他のオプションは、彼らがADDにのみ/ SUBT Y/ONEおよび終了条件000対800を、異なるように、それぞれの状況(4つの亜種)のためのルーチンの別のバリエーションを持っているとすることができますそれぞれのケースでより少ない命令を実行することができます(パフォーマンスは向上します)。しかし、コードラインとコードを少し追加すれば、新しいアイデアを得ることができます。