1

继续我之前的问题从 C 中的文件中读取字符串并将它们作为 lc3 分解器进行操作时遇到问题

我现在需要使用 ADD & AND 在 lc3 反汇编器中实现立即寻址模式

例如,如果一个文件包含:

1283

5105

1df7

506f

我想打印出来:

添加 r1,r2,r3

和 r0,r4,r5

添加 r6,r7,-9

和 r0,r1,15

我如何能够打印出 -9 和 15 我知道我需要将其转换为二进制补码,但不确定如何。

这是我引用 ADD 指令的 If 语句的代码,即。输出的第 3 行和第 1 行

while (fscanf(file, "%s", hexString) != EOF){

    long int instruction = strtol(hexString, NULL, 16);

        if (instruction >> 12 == 0b0001){ //op code is ADD

            if ((instruction >> 5) & 0b001){ //is using “immediate” addressing mode

            dr = (instruction >> 9) & 0b111;
            sr1 = (instruction >> 6) & 0b111;
            sr2 = (!instruction) & 0b11111 + 1; // this needs to convert to twos complement

            printf("and r%d,r%d,%d \n", dr, sr1,sr2);   

            } else {

            dr = (instruction >> 9) & 0b111; // turns other bits to zero
            sr1 = (instruction >> 6) & 0b111;
            sr2 = (instruction) & 0b111;

            printf("add r%d,r%d,r%d \n", dr, sr1, sr2);
            }
        } else if ....

这是 lc3 指令集的副本供参考http://ece224web.groups.et.byu.net/reference/LC3_Instructions.gif

4

1 回答 1

4

问题是使用逻辑非代替按位非。

试试这个:

sr2 = (0x10 & instruction) ? ((~(instruction & 0x1F)) + 1) : (instruction & 0x1F);

我正在利用二进制补码的属性:如果设置了最高有效位,则该数字为负数,我们可以通过翻转所有位(〜,按位非)并加 1 使其为正数。

看起来您试图这样做,但您需要注意这一点!(逻辑非)可能会返回 1(如果 val == 0)或 0(如果 val != 0)。

说明差异的示例:

uint8_t value = 0xAA;
uint8_t logical_not = !value;
uint8_t bitwise_not = ~value;

printf("initial value: 0x%02X, logical not: 0x%02X, bitwise not: 0x%02X\n", value, logical_not, bitwise_not);

您希望看到的是:

initial value: 0xAA, logical not: 0x00, bitwise not: 0x55

添加您需要自己验证的所有内容:

测试程序:

#include <stdio.h>

void main(void)
{
    uint8_t value = 0xAA;   // Test value: 0b10101010
    uint8_t lnot = !value;  // logical not of test value
    uint8_t bnot = ~value;  // bitwise not of test value

    printf("v: 0x%02X, L: 0x%02X, B: 0x%02X\n", value, lnot, bnot);
}

程序输出:

$ gcc test.c
$ ./a.exe
v: 0xAA, L: 0x00, B: 0x55
$
于 2014-10-20T01:28:36.657 回答