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
「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」は
書かれていなかったのでわかりませんが、フラグは変化しないとします。
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 に設定 }


