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

 以下に、**NAND回路**をラダー言語(ラダー図)とアセンブリ言語(x86)で記述した例を説明します。NANDはANDの否定であり、デジタル回路の基本ゲートの1つです。


---


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

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

```

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

|  A  | |  B  |  NOT  |     OUT     |

```

**動作**:  

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

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


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

```

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

| A |   | B |  OUT  |

```

**動作**:  

- `A` と `B` が**両方ONでない場合**に `OUT` がON(NANDの定義通り)


---


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

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

```assembly

section .data

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

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

    OUT db  0       ; 出力OUT


section .text

    global _start


_start:

    ; NAND演算: NOT (A AND B)

    mov  al, [A]

    and  al, [B]    ; AL = A AND B

    xor  al, 1      ; AL = NOT (A AND 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


    ; NAND演算

    and  al, bl      ; A AND B

    xor  al, 1       ; NOTを適用

    out  0x22, al    ; 結果を出力


    jmp  _start      ; 無限ループ

```


---


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

| A | B | A AND B | OUT (NAND) |

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

| 0 | 0 |    0   |     1     |

| 0 | 1 |    0   |     1     |

| 1 | 0 |    0   |     1     |

| 1 | 1 |    1   |     0     |


---


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

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

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

| 直列接点(AND部分) | `and` 命令                |

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

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


---


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

NANDは「ANDの否定」なので、`AND`+`NOT`の代わりに条件分岐で実装可能:

```assembly

_start:

    mov  al, [A]

    and  al, [B]

    jz   set_output  ; A AND B=0 ならジャンプ

    mov  al, 0       ; そうでなければOUT=0

    jmp  save

set_output:

    mov  al, 1       ; OUT=1

save:

    mov  [OUT], al

```


---


### 6. 重要な注意点

1. **PLCのNOT接点**:  

   機種によって `|/|`(常時閉)か `|\|`(常時開)の記号が異なる場合があります。


2. **アセンブリのNOT演算**:  

   - `xor al, 1`:最下位ビットの反転(1ビット操作)  

   - `not al`:全ビット反転(8ビット操作)→ マスクが必要


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

   実際のPLCでは、NAND演算の遅延時間がシステム動作に影響する場合があります。


---


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

NANDは**万能論理ゲート**と呼ばれ、他の全ての論理回路を構成できます。  

例)NOTゲートの作成:

```assembly

; NOT X = X NAND X

mov  al, [X]

and  al, al    ; AL = X AND X

xor  al, 1     ; AL = NOT X

```


このように、NAND回路は組み合わせ次第で複雑な論理を表現できます。ハードウェア制御やPLCプログラミングで頻繁に利用される基本パターンです。

コメント

このブログの人気の投稿

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

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

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