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

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

アセンブラ(11)

関数電卓コマンド版(7) - 非専門的シンギュラリティー研究所」で Windows のデスクトップアプリケーション版にコンソール風の入出力とグラフィックス機能を追加していますが、ここでもそれを導入します。

ここでは描画処理を行う関数を作成しているので、それを確認するためです。

GCC の出力に現れる命令についても継続して見ていきます。

executeInstruction 関数の処理(5) 論理演算系の命令

論理演算系の命令には以下のようなものがあります。

and

「and src, dst」は dst と src のビットごとの論理積を dst に設定します。

フラグは N と Z は値によって変化し、V と C は 0、X は変化しません。

    else if (instruction.is_and_instruction()) {
        // AND命令の処理
        if (operands.size() != 2) {
            cerr << "Invalid AND instruction: " << line << endl;
            return;
        }
        Operand& src = operands[0];
        Operand& dst = operands[1];
        int32_t src_value = src.get_value(instruction.data_size());
        int32_t dst_value = dst.get_value(instruction.data_size());
        int32_t value = dst_value & src_value;
        dst.set_value(value, instruction.data_size());
        if (instruction.modifies_flags()) {
            cpu.set_value_status(value, instruction.data_size());
        }
    }
or

「or src, dst」は dst と src のビットごとの論理和を dst に設定します。

フラグは N と Z は値によって変化し、V と C は 0、X は変化しません。

    else if (instruction.is_or_instruction()) {
        // OR命令の処理
        if (operands.size() != 2) {
            cerr << "Invalid OR instruction: " << line << endl;
            return;
        }
        Operand& src = operands[0];
        Operand& dst = operands[1];
        int32_t src_value = src.get_value(instruction.data_size());
        int32_t dst_value = dst.get_value(instruction.data_size());
        int32_t value = dst_value | src_value;
        dst.set_value(value, instruction.data_size());
        if (instruction.modifies_flags()) {
            cpu.set_value_status(value, instruction.data_size());
        }
    }
eor

「eor src, dst」は dst と src のビットごとの排他的論理和を dst に設定します。

フラグは N と Z は値によって変化し、V と C は 0、X は変化しません。

    else if (instruction.is_eor_instruction()) {
        // EOR命令の処理
        if (operands.size() != 2) {
            cerr << "Invalid EOR instruction: " << line << endl;
            return;
        }
        Operand& src = operands[0];
        Operand& dst = operands[1];
        int32_t src_value = src.get_value(instruction.data_size());
        int32_t dst_value = dst.get_value(instruction.data_size());
        int32_t value = dst_value ^ src_value;
        dst.set_value(value, instruction.data_size());
        if (instruction.modifies_flags()) {
            cpu.set_value_status(value, instruction.data_size());
        }
    }
not

「not dst」は dst のビットを反転したものを dst に設定します。

フラグは N と Z は値によって変化し、V と C は 0、X は変化しません。

    else if (instruction.is_not_instruction()) {
        // NOT命令の処理
        if (operands.size() != 1) {
            cerr << "Invalid NOT instruction: " << line << endl;
            return;
        }
        Operand& dst = operands[0];
        int32_t val = dst.get_value(instruction.data_size());
        int32_t value = ~val;
        dst.set_value(value, instruction.data_size());
        if (instruction.modifies_flags()) {
            cpu.set_value_status(value, instruction.data_size());
        }
    }