首页 > 解决方案 > **i= 0 then x[i]= even, i =1 then [i]= odd** 从汇编转换为 Java 编程

问题描述

这是来自评估练习的问题,如下所示。尽管我从网上找到并总结了答案,但我仍然不知道它在 Java 编程中是如何工作的,这可以帮助新学习者理解逻辑,因此我更有可能将其转换为 Sigma 16 中的汇编语言系统。

问:Sigma16 系统在内存中有一个 16 位带符号数的数组 X 。编写一个汇编语言程序来编写第二个数组 Y,如果 X 的第 i 个元素是偶数,则它的第 i 个元素为 0,如果它是奇数,则为 1。

答:

        ADD R1, R0, R0  ; i = 0
        LEA R2, 4[R0]   ; R2 = 4
        LEA R3, 1[R0]   ; R3 = 1
        LEA R4, 2[R0]   ; R4 = 2
Loop    LOAD R5, X[R1]  ; R5 = x[i]

        DIV R6, R5, R4      ; x[i] / 2
        STORE R15, Y[R1]    ; y[i] = x[i] mod 2

        ADD R1, R1, R3      ; i++
        CMPLT R15, R1, R2   ; If i< 4 then⋯
        JUMPT R15, Loop[R0] ; Loop

        TRAP R0,R0,R0

非常感谢您的回答。如果上面的代码有错误,也请更正。

标签: javaassembly

解决方案


Java 中的16 位有符号整数是shorts,因此 Java 中的等效代码片段可能是:

short[]x = new short[]{32, 203, 98, 19, 47, 78}; 
short[]y = new short[x.length]; 

for (int i = 0; i < x.length; ++x)
    if (x[i] % 2 == 0)  // % is the remainder operator 
        y[i] = 0;
    else
        y[i] = 1;  

您也可以在一行中进行奇偶测试

    y[i] = (x[i] % 2 == 0) ? 0 : 1;

除了“除以 2 后的余数”测试之外,还可以选择更类似于汇编的按位运算:

    y[i] = x[i] & 1;

推荐阅读