1

私の前の質問からの続きで、C でファイルから文字列を読み取る際に問題が発生し、それらを lc3 disassmbler として操作する

ADD & AND を使用して、lc3 逆アセンブラーで即時アドレッシング モードを実装する必要があります。

たとえば、ファイルに次のものが含まれているとします。

1283

5105

1df7

506f

印刷したいのは:

r1、r2、r3を追加

および r0、r4、r5

r6、r7、-9を追加

およびr0、r1、15

-9 と 15 を出力するにはどうすればよいでしょうか。2 の補数に変換する必要があることは理解していますが、その方法がわかりません。

これは、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

問題は、ビットごとの NOT の代わりに論理 NOT を使用することです。

代わりにこれを試してください:

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

私は 2 の補数の性質を利用しています: 最上位ビットが設定されている場合、数値は負であり、すべてのビットを反転させ (~、ビットごとの NOT)、1 を追加することで正にすることができます。

これをやろうとしたように見えますが、注意する必要があります。(論理 NOT) は 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 に答える