如何换号码?

问题描述 投票:0回答:1

我想用 MARIE 汇编语言创建一个程序,在其中输入一个数字(以十六进制模式),并且该数字应向左或向右移动多次。我想过将单独的位存储在数组中,但 MARIE 不支持访问数字的单个位。我想知道这是否可能?

我怎样才能做到这一点?

assembly binary hex marie
1个回答
0
投票

将数字向左移动很简单:只需将数字与其自身相加即可。

要将数字右移,您可以使用具有 2 的所有幂的数组:这将允许程序轻松访问 2 的 decreasing 幂,并查看输入数字中是否设置了相应的位。如果是这样,它可以设置结果中的“下一个”(较小的)位。

由于 MARIE 使用 16 位有符号整数,我将只关注正数,这意味着我们有 15 个相关位(即 2 的幂)。

如果 JavaScript 中只有加法和减法可用,那么您将如何执行此操作:

const powers = [0x1,    0x2,    0x4,    0x8,
                0x10,   0x20,   0x40,   0x80,
                0x100,  0x200,  0x400,  0x800,
                0x1000, 0x2000, 0x4000];

function shiftRight(num) {
    let result = 0;
    let index = 14;
    while (index > 0) {
        let power = powers[index];
        index--;
        if (power <= a) {
            a -= power;
            result += powers[index];
        }
    }
    return result;
}


let a = 0b10_1110_1011;
a = shiftRight(a);
console.log(a.toString(2));

翻译成MARIE,从用户输入开始,我们得到:

Input 
JnS   ShiftRight  / Will shift the value in AC
Output
Halt
          
//////////////////////////////////////
// Subroutine ShiftRight(AC)        //
//////////////////////////////////////
ShiftRight,  HEX 0              / Space for the return address

             Store srNum        / Save the number to be shifted
             Clear
             Store srResult

             Load srMaxPowerAdr / Start with the greatest power of 2
             Store srPowerAdr
          
srLoop,      LoadI srPowerAdr   / Read current power of 2
             Store srPower
             Load srPowerAdr    / Move pointer one back
             Subt srOne
             Store srPowerAdr
             Subt  srMinPowerAdr
             SkipCond 000       / Skip when MinPowerAdr > PowerAdr
             Jump srCompare     / Else compare Power
             Jump srFinish      / All powers done
      
srCompare,   Load srNum
             Subt srPower
             SkipCond 000       / Skip when Power > Num
             Jump srSubtract    / Otherwise we subtract the Power from our Num
             Jump srLoop
      
srSubtract,  Store srNum        / We only need to save the difference
             LoadI srPowerAdr   / Add half of the power to the Result
             Add   srResult
             Store srResult
             Jump  srLoop

srFinish,    Load srResult      / The shifted number is returned in AC
             JumpI ShiftRight

/ Variables for ShiftRight
srNum,         Dec 0
srResult,      Dec 0
srPowerAdr,    Dec 0
srPower,       Dec 0

/ Constants for ShiftRight
srOne,         Dec 1
srMinPowerAdr, ADR srMinPower
srMinPower,    HEX    1
               HEX    2
               HEX    4
               HEX    8
               HEX   10
               HEX   20
               HEX   40
               HEX   80
               HEX  100
               HEX  200
               HEX  400
               HEX  800
               HEX 1000
               HEX 2000
srMaxPower,    HEX 4000
srMaxPowerAdr, ADR srMaxPower
//////////////////////////////////////

主程序只是为了说明子程序将累加器中的值右移一位。

如果需要将数字向右移动 3 位,则只需调用子例程多次即可。

© www.soinside.com 2019 - 2024. All rights reserved.