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

 以下に、**XOR回路(排他的論理和)**をラダー言語(ラダー図)とアセンブリ言語(x86)で記述した例を説明します。XORは「入力が異なるときに真」となる特性を持ち、制御システムで頻繁に利用されます。


---


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

#### 方法1: 基本ロジックの組み合わせ

```

|-----| |/|---( )--|     (A AND NOT B)

|  A  | | B |  OUT1 |

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

|/|---|-----|      |

| A |  |  B |       |

|-----|-------( )--|     (NOT A AND B)

          OUT2 |

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

|OUT1 |  OUT2  OUT |  (OUT1 OR OUT2)

```

**動作**:  

1. `(A AND NOT B)` と `(NOT A AND B)` を並列実行  

2. 両方の結果をORで統合


#### 方法2: 機種依存のXOR命令(一部PLC)

```

|--[XOR A B]--( )--|

|            OUT   |

```

(※三菱電機PLCなどでは`XOR`命令が直接利用可能)


---


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

#### 基本実装(メモリ変数使用)

```assembly

section .data

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

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

    OUT db  0       ; 出力OUT


section .text

    global _start


_start:

    ; XOR演算: A XOR B

    mov  al, [A]

    xor  al, [B]    ; AL = A XOR B (排他的論理和)

    mov  [OUT], al  ; 結果を保存


    ; プログラム終了

    mov  eax, 1

    int  0x80

```


#### 物理I/O版(PLC風リアルタイム制御)

```assembly

section .text

    global _start


_start:

    ; ポートから入力読み取り

    in   al, 0x20    ; A

    and  al, 0x01

    in   bl, 0x21    ; B

    and  bl, 0x01


    ; XOR演算

    xor  al, bl      ; A XOR B

    out  0x22, al    ; 結果を出力


    jmp  _start      ; 無限ループ

```


---


### 3. 動作の真理値表

| A | B | OUT (XOR) |

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

| 0 | 0 |    0     |

| 0 | 1 |    1     |

| 1 | 0 |    1     |

| 1 | 1 |    0     |


---


### 4. ラダー図とアセンブリの対応ポイント

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

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

| 排他的条件の並列分岐    | `xor` 命令直接利用   |

| 中間リレー(OUT1/OUT2) | レジスタ暫存        |


---


### 5. 最適化されたアセンブリ実装

条件分岐を利用した明示的実装:

```assembly

_start:

    mov  al, [A]

    cmp  al, [B]

    jne  set_one    ; A ≠ B の場合ジャンプ

    mov  al, 0      ; OUT=0

    jmp  save

set_one:

    mov  al, 1      ; OUT=1

save:

    mov  [OUT], al

```


---


### 6. 重要な注意点

1. **PLCのXOR実装コスト**:  

   ラダー図ではXORを4つの接点で表現する必要があり、メモリリレーを消費します。


2. **アセンブリの`xor`命令**:  

   - ビット単位演算のため、マスク処理(`and al, 0x01`)が必要  

   - フラグレジスタに影響(`jnz`などの分岐に活用可能)


3. **タイミング制約**:  

   物理I/Oでは入力のチャタリング防止にディレイ処理が必要な場合があります。


---


### 7. 応用例(パリティチェック)

XORを使った偶数パリティ生成:

```assembly

mov  al, [DATA]

xor  al, [PARITY]  ; パリティビット更新

```


#### ラダー図での応用(不一致検出):

```

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

| A   | | B   |  ALARM    |

|-----| |/|---|          |

|/|---|-----|           |

| A |  | B   |           |

```

(AとBが異なるとアラーム作動)


---


XOR回路は「状態の不一致検出」や「エンコーダ処理」に不可欠です。PLCではシーケンス制御、アセンブリでは暗号化処理など多様な場面で活用されます。

コメント

このブログの人気の投稿

Pydroid用ピアノアプリ+ラフマニノフピアノ協奏曲第2番1楽章デモ音源付き

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

訴えの変更(追加的変更)申立