OR回路をラダー言語とアッセンブリ言語で書く
以下に、**OR回路**をラダー言語(ラダー図)とアセンブリ言語(x86)で記述した例を説明します。AND回路との違いに注目してください。
---
### 1. ラダー言語(ラダー図)でのOR回路
#### 例: 2入力OR回路(A OR B → OUT)
```
|-----|-------( )--|
| A | OUT |
|-----| |
| B | |
```
**動作条件**:
- 入力 `A` **または** 入力 `B` のいずれかがON(接点閉)のとき、出力 `OUT` がON(コイル励磁)します。
---
### 2. x86アセンブリ言語でのOR回路
#### 例: メモリ変数を使った実装
```assembly
section .data
A db 1 ; 入力A (1=ON, 0=OFF)
B db 0 ; 入力B (1=ON, 0=OFF)
OUT db 0 ; 出力OUT (初期値0)
section .text
global _start
_start:
; OR演算の実行
mov al, [A] ; AL = Aの値
or al, [B] ; AL = A OR B
mov [OUT], al ; OUT = 結果
; プログラム終了
mov eax, 1 ; システムコール番号 (exit)
int 0x80 ; カーネル呼び出し
```
#### 動作説明:
1. `A` と `B` の値をレジスタ `AL` にロード
2. `OR` 命令で論理和を計算
- `A=1` **または** `B=1` の場合に `AL=1` になります
3. 結果を `OUT` に格納
---
### 3. 物理I/Oを使った実装(PLC風)
```assembly
section .text
global _start
_start:
; ポート0x20から入力Aを読み取り
in al, 0x20 ; AL = Aの状態
and al, 0x01 ; 最下位ビットを抽出
; ポート0x21から入力Bを読み取り
in bl, 0x21 ; BL = Bの状態
and bl, 0x01
; OR演算
or al, bl ; AL = A OR B
; ポート0x22に結果を出力
out 0x22, al
; PLCのように無限ループ
jmp _start
```
---
### 4. ラダー図とアセンブリの対応関係
| ラダー要素 | アセンブリ対応 |
|-------------------|-----------------------------|
| 並列接点(A/B) | `or` 命令 |
| 出力コイル(OUT) | `mov [OUT], al` または `out` |
---
### 5. AND回路との違い
| 回路タイプ | ラダー図の構造 | アセンブリ命令 |
|------------|---------------------|----------------|
| **AND** | 直列接点 | `and` |
| **OR** | 並列接点 | `or` |
---
### 6. 応用例(NOT-OR回路)
ラダー図:
```
|-----| |-----|-------( )--|
| A | | B | OUT |
```
(AとBが**両方OFF**の時にOUT=ON)
アセンブリ:
```assembly
mov al, [A]
or al, [B] ; A OR B
xor al, 1 ; 結果を反転(NOT)
mov [OUT], al
```
---
### 7. 重要な注意点
1. **PLCのスキャンサイクル**:
実機ではラダープログラムを**左→右、上→下**の順でスキャンします。アセンブリの無限ループがこれを模倣します。
2. **即時反映の必要性**:
実際の制御では、入力変化から出力反映までの時間が重要です。アセンブリでは命令実行時間を考慮する必要があります。
3. **ビットマスク**:
物理I/Oでは`and al, 0x01`で不要ビットをマスクします(PLCは1ビット単位で操作するため)。
このように、OR回路はアセンブリでは **`OR`命令** で自然に表現できます。AND/OR/NOTの組み合わせで複雑な制御ロジックを構築可能です。
コメント
コメントを投稿