继续我之前的问题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
$