我想用 MARIE 汇编语言创建一个程序,在其中输入一个数字(以十六进制模式),并且该数字应向左或向右移动多次。我想过将单独的位存储在数组中,但 MARIE 不支持访问数字的单个位。我想知道这是否可能?
我怎样才能做到这一点?
将数字向左移动很简单:只需将数字与其自身相加即可。
要将数字右移,您可以使用具有 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 位,则只需调用子例程多次即可。