非専門的シンギュラリティー研究所

無限に動き続けるシステムを表す方法を AI なども使って考えていきます。

アセンブラ(9)

executeInstruction 関数の処理(3)

lea

「lea src, dst」は src のアドレスを dst に設定します。

書かれていなかったのでわかりませんが、フラグは変化しないとします。

    else if (instruction.is_lea_instruction()) {
        // LEA命令の処理
        if (operands.size() != 2) {
            cerr << "Invalid LEA instruction: " << line << endl;
            return;
        }
        int32_t address = operands[0].get_address();
        operands[1].set_value(address, 4);
    }
pea

「pea src」は src のアドレスをスタックにプッシュします。

書かれていなかったのでわかりませんが、フラグは変化しないとします。

    else if (instruction.is_pea_instruction()) {
        // PEA命令の処理
        if (operands.size() != 1) {
            cerr << "Invalid PEA instruction: " << line << endl;
            return;
        }
        int32_t address = operands[0].get_address();
        cpu.push(address, 4); // スタックにアドレスをプッシュ
    }

「link reg, size」は

  • reg で指定したレジスタの内容をスタックに退避した後、
  • sp の内容を reg に設定して、
  • sp に size を加算します。

書かれていなかったのでわかりませんが、フラグは変化しないとします。

    else if (instruction.is_link_instruction()) {
        // LINK命令の処理
        if (operands.size() != 2) {
            cerr << "Invalid LINK instruction: " << line << endl;
            return;
        }
        Operand& dst = operands[0]; // 第一オペランドを dst とする
        Operand& size_operand = operands[1];
        int32_t dst_value = dst.get_value(instruction.data_size());
        int32_t size_value = size_operand.get_value(instruction.data_size());
        cpu.push(dst_value, 4); // スタックに dst をプッシュ
        dst.set_value(cpu.a[7], 4); // dst に sp の値を設定
        cpu.a[7] += size_value; // スタックポインタをサイズ分増やす
    }
unlk

「unlk reg」は

  • reg で指定したレジスタの内容を sp に設定して、
  • reg で指定したレジスタの内容をスタックから復元します。

書かれていなかったのでわかりませんが、フラグは変化しないとします。

    else if (instruction.is_unlk_instruction()) {
        // UNLK命令の処理
        if (operands.size() != 1) {
            cerr << "Invalid UNLK instruction: " << line << endl;
            return;
        }
        Operand& dst = operands[0]; // 第一オペランドを dst とする
        int32_t dst_value = dst.get_value(instruction.data_size());
        cpu.a[7] = dst_value; // スタックポインタを戻す
        dst.set_value(cpu.pop(4), 4); // スタックから値をポップして dst に設定
    }