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ではシーケンス制御、アセンブリでは暗号化処理など多様な場面で活用されます。
コメント
コメントを投稿