继续我之前的问题Having trouble reading strings from a file in C and manipluating them as an lc3 disassmbler
我现在需要使用ADD&AND在lc3反汇编程序中实现即时寻址模式
例如,如果文件包含:
一千二百八十三
五千一百零五
1df7层
506华氏度
我想打印出来:
加r1,r2,r3
和r0,r4,r5
加上r6,r7,-9
和r0,r1,15
我怎么能打印出-9和-15,我知道我需要把它转换成两个补码,但不知道怎么打印。
这是我的If语句代码,它引用了ADD指令,即输出的第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

最佳答案

问题是使用逻辑不代替按位不。
请改为:

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

我利用了2的补码的一个性质:如果设置了最高有效位,则数字为负,我们可以通过翻转所有位(~,按位不)并加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
$

10-08 18:34