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プログラミングで頻繁に利用される基本パターンです。
コメント
コメントを投稿