OR回路をラダー言語とアッセンブリ言語で書く

 以下に、**OR回路**をラダー言語(ラダー図)とアセンブリ言語(x86)で記述した例を説明します。AND回路との違いに注目してください。


---


### 1. ラダー言語(ラダー図)でのOR回路

#### 例: 2入力OR回路(A OR B → OUT)

```

|-----|-------( )--|

|  A  |   OUT     |

|-----|           |

|  B  |           |

```

**動作条件**:  

- 入力 `A` **または** 入力 `B` のいずれかがON(接点閉)のとき、出力 `OUT` がON(コイル励磁)します。


---


### 2. x86アセンブリ言語でのOR回路

#### 例: メモリ変数を使った実装

```assembly

section .data

    A   db  1       ; 入力A (1=ON, 0=OFF)

    B   db  0       ; 入力B (1=ON, 0=OFF)

    OUT db  0       ; 出力OUT (初期値0)


section .text

    global _start


_start:

    ; OR演算の実行

    mov  al, [A]    ; AL = Aの値

    or   al, [B]    ; AL = A OR B

    mov  [OUT], al  ; OUT = 結果


    ; プログラム終了

    mov  eax, 1     ; システムコール番号 (exit)

    int  0x80       ; カーネル呼び出し

```


#### 動作説明:

1. `A` と `B` の値をレジスタ `AL` にロード

2. `OR` 命令で論理和を計算  

   - `A=1` **または** `B=1` の場合に `AL=1` になります

3. 結果を `OUT` に格納


---


### 3. 物理I/Oを使った実装(PLC風)

```assembly

section .text

    global _start


_start:

    ; ポート0x20から入力Aを読み取り

    in   al, 0x20    ; AL = Aの状態

    and  al, 0x01    ; 最下位ビットを抽出


    ; ポート0x21から入力Bを読み取り

    in   bl, 0x21    ; BL = Bの状態

    and  bl, 0x01


    ; OR演算

    or   al, bl      ; AL = A OR B


    ; ポート0x22に結果を出力

    out  0x22, al


    ; PLCのように無限ループ

    jmp  _start

```


---


### 4. ラダー図とアセンブリの対応関係

| ラダー要素        | アセンブリ対応               |

|-------------------|-----------------------------|

| 並列接点(A/B)   | `or` 命令                   |

| 出力コイル(OUT) | `mov [OUT], al` または `out` |


---


### 5. AND回路との違い

| 回路タイプ | ラダー図の構造       | アセンブリ命令 |

|------------|---------------------|----------------|

| **AND**    | 直列接点            | `and`          |

| **OR**     | 並列接点            | `or`           |


---


### 6. 応用例(NOT-OR回路)

ラダー図:

```

|-----| |-----|-------( )--|

|  A  | |  B  |   OUT     |

```

(AとBが**両方OFF**の時にOUT=ON)


アセンブリ:

```assembly

mov al, [A]

or  al, [B]    ; A OR B

xor al, 1      ; 結果を反転(NOT)

mov [OUT], al

```


---


### 7. 重要な注意点

1. **PLCのスキャンサイクル**:  

   実機ではラダープログラムを**左→右、上→下**の順でスキャンします。アセンブリの無限ループがこれを模倣します。

   

2. **即時反映の必要性**:  

   実際の制御では、入力変化から出力反映までの時間が重要です。アセンブリでは命令実行時間を考慮する必要があります。


3. **ビットマスク**:  

   物理I/Oでは`and al, 0x01`で不要ビットをマスクします(PLCは1ビット単位で操作するため)。


このように、OR回路はアセンブリでは **`OR`命令** で自然に表現できます。AND/OR/NOTの組み合わせで複雑な制御ロジックを構築可能です。

コメント

このブログの人気の投稿

ミライアイ内服薬は薬事法違反で、ほとんど効果がない詐欺ですか?

最高裁での上告理由書受理・却下の判断基準について

裁判官の忌避申立書の作成例