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

 以下に、**NOR回路**をラダー言語(ラダー図)とアセンブリ言語(x86)で記述した例を説明します。NORは「ORの否定」であり、NANDと同様に万能論理ゲートとして機能します。


---


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

#### 方法1: OR + NOTの組み合わせ

```

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

|  A  |       NOT    OUT     |

|-----|                      |

|  B  |                      |

```

**動作**:  

1. `A` OR `B` を計算  

2. その結果をNOT(否定)して `OUT` に出力


#### 方法2: 否定接点を利用(PLC機種依存)

```

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

| A |  | B |  OUT  |

```

**動作**:  

- `A` と `B` が**両方OFFの場合のみ** `OUT` がON(NORの定義通り)


---


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

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

```assembly

section .data

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

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

    OUT db  0       ; 出力OUT


section .text

    global _start


_start:

    ; NOR演算: NOT (A OR B)

    mov  al, [A]

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

    xor  al, 1      ; AL = NOT (A OR B) (ビット反転)

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


    ; プログラム終了

    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


    ; NOR演算

    or   al, bl      ; A OR B

    xor  al, 1       ; NOTを適用

    out  0x22, al    ; 結果を出力


    jmp  _start      ; PLCのように無限ループ

```


---


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

| A | B | A OR B | OUT (NOR) |

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

| 0 | 0 |   0   |    1     |

| 0 | 1 |   1   |    0     |

| 1 | 0 |   1   |    0     |

| 1 | 1 |   1   |    0     |


---


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

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

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

| 並列接点(OR部分)  | `or` 命令                 |

| NOT演算             | `xor al, 1`(ビット反転) |

| 出力コイル          | `mov [OUT], al`           |


---


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

条件分岐を利用した高速化:

```assembly

_start:

    mov  al, [A]

    or   al, [B]    ; A OR B

    jnz  set_zero   ; 結果が0でない場合ジャンプ

    mov  al, 1      ; OUT=1 (NORが真)

    jmp  save

set_zero:

    mov  al, 0      ; OUT=0

save:

    mov  [OUT], al

```


---


### 6. 重要な注意点

1. **PLCの論理評価順序**:  

   ラダー図では上から下へ順次評価されるため、NORの実装方法によって動作が異なる場合があります。


2. **アセンブリのビット操作**:  

   - 物理I/Oでは`and al, 0x01`でマスク処理が必要(PLCは1ビット単位)  

   - `not`命令は全ビット反転のため、`xor al, 1`が安全


3. **NORの特性**:  

   ```

   NOT (A OR B) = NOT A AND NOT B

   ```

   この性質を利用すれば、否定接点のみでラダー図を構成可能です。


---


### 7. 応用例(他の論理ゲートの構築)

NORも**万能論理ゲート**です。例としてNOTゲートの作成:

```assembly

; NOT X = X NOR X

mov  al, [X]

or   al, al    ; AL = X OR X

xor  al, 1     ; AL = NOT X

```


#### ANDゲートの構成(ド・モルガンの法則利用):

```

A AND B = NOT ((NOT A) OR (NOT B))

```

対応するアセンブリ:

```assembly

mov  al, [A]

xor  al, 1      ; NOT A

mov  bl, [B]

xor  bl, 1      ; NOT B

or   al, bl     ; (NOT A) OR (NOT B)

xor  al, 1      ; NOT → AND完成

```


---


NOR回路は組み合わせ次第で任意の論理回路を構築できるため、PLCや低レベル制御プログラムで重要な役割を果たします。ハードウェア記述言語(HDL)やFPGA設計でも同様の原理が適用されます。

コメント

このブログの人気の投稿

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

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

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