ΠΡΠΎΠ΅ΠΊΡΠΈΡΠΎΠ²Π°Π½ΠΈΠ΅ ΠΊΠΎΠΌΠΏΠΈΠ»ΡΡΠΎΡΠ°
ΠΠΏΠ΅ΡΠ°ΡΠΈΡ: ΠΡΠ΅ΡΡΠ²Π°Π΅Ρ Π²ΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΡ ΠΈ ΠΏΠ΅ΡΠ΅Π΄Π°Π΅Ρ ΡΠΏΡΠ°Π²Π»Π΅Π½ΠΈΠ΅ ΠΏΠΎ ΠΎΠ΄Π½ΠΎΠΌΡ ΠΈΠ· 256 Π°Π΄ΡΠ΅ΡΠΎΠ² (Π²Π΅ΠΊΡΠΎΡΠΎΠ² ΠΏΡΠ΅ΡΡΠ²Π°Π½ΠΈΡ). ΠΠΎΠΌΠ°Π½Π΄Π° INT Π²ΡΠΏΠΎΠ»Π½ΡΠ΅Ρ ΡΠ»Π΅Π΄ΡΡΡΠ΅Π΅: 1) ΡΠΌΠ΅Π½ΡΡΠ°Π΅Ρ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ SP Π½Π° 2 ΠΈ Π·Π°Π½ΠΎΡΠΈΡ Π² ΡΡΠ΅ΠΊ ΡΠ»Π°Π³ΠΎΠ²ΡΠΉ ΡΠ΅Π³ΠΈΡΡΡ, ΡΠ±ΡΠ°ΡΡΠ²Π°Π΅Ρ ΡΠ»Π°Π³ΠΈ IF ΠΈ TF; 2) ΡΠΌΠ΅Π½ΡΡΠ°Π΅Ρ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ SP Π½Π° 2 ΠΈ Π·Π°Π½ΠΎΡΠΈΡ ΡΠ΅Π³ΠΈΡΡΡ CS Π² ΡΡΠ΅ΠΊ, ΡΡΠ°ΡΡΠ΅Π΅ ΡΠ»ΠΎΠ²ΠΎ ΠΈΠ· Π²Π΅ΠΊΡΠΎΡΠ° ΠΏΡΠ΅ΡΡΠ²Π°Π½ΠΈΡ ΠΏΠΎΠΌΠ΅ΡΠ°Π΅Ρ Π² ΡΠ΅Π³ΠΈΡΡΡ CS; 3) ΡΠΌΠ΅Π½ΡΡΠ°Π΅Ρ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ SP Π½Π° 2 ΠΈ Π·Π°Π½ΠΎΡΠΈΡ… Π§ΠΈΡΠ°ΡΡ Π΅ΡΡ >
ΠΡΠΎΠ΅ΠΊΡΠΈΡΠΎΠ²Π°Π½ΠΈΠ΅ ΠΊΠΎΠΌΠΏΠΈΠ»ΡΡΠΎΡΠ° (ΡΠ΅ΡΠ΅ΡΠ°Ρ, ΠΊΡΡΡΠΎΠ²Π°Ρ, Π΄ΠΈΠΏΠ»ΠΎΠΌ, ΠΊΠΎΠ½ΡΡΠΎΠ»ΡΠ½Π°Ρ)
Π¦Π΅Π»Ρ ΡΠ°Π±ΠΎΡΡ
ΠΠ·ΡΡΠΈΡΡ ΠΈ ΠΏΠΎΠ½ΡΡΡ ΠΏΡΠΈΠ½ΡΠΈΠΏ ΡΠ°Π±ΠΎΡΡ ΡΡΠ°Π½ΡΠ»ΡΡΠΎΡΠ°. ΠΡΡΠ»Π΅Π΄ΠΎΠ²Π°ΡΡ ΡΠΎΡΠΌΠ°Ρ Π΄Π°Π½Π½ΡΡ ΠΎΠ±ΡΠ΅ΠΊΡΠ½ΠΎΠ³ΠΎ ΡΠ°ΠΉΠ»Π° Π΄Π»Ρ ΡΠ΅ΡΡΠ½Π°Π΄ΡΠ°ΡΠΈΡΠ°Π·ΡΡΠ΄Π½ΠΎΠΉ ΡΠΈΡΡΠ΅ΠΌΡ DOS Π΄Π»Ρ ΠΏΠΎΡΠ»Π΅Π΄ΡΡΡΠ΅Π³ΠΎ ΠΏΡΠ΅ΠΎΠ±ΡΠ°Π·ΠΎΠ²Π°Π½ΠΈΡ Π΅Π³ΠΎ Π² ΡΠ°ΠΉΠ» ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΡ.
Π Π°ΡΡΠ΅Ρ Π²Π°ΡΠΈΠ°Π½ΡΠ° Π·Π°Π΄Π°Π½ΠΈΡ ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡΡΡ ΠΏΠΎ ΡΠΎΡΠΌΡΠ»Π΅:
ΠΊΠΎΠΌΠΏΠΈΠ»ΡΡΠΎΡ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠ° Π°ΡΡΠ΅ΠΌΠ±Π»Π΅Ρ Π°Π»Π³ΠΎΡΠΈΡΠΌ
Π³Π΄Π΅ NG — ΠΏΠΎΡΠ»Π΅Π΄Π½ΠΈΠ΅ Π΄Π²Π΅ ΡΠΈΡΡΡ ΡΡΠ΅Π±Π½ΠΎΠΉ Π³ΡΡΠΏΠΏΡ; NS — Π½ΠΎΠΌΠ΅Ρ ΡΡΡΠ΄Π΅Π½ΡΠ° Π² ΡΠΏΠΈΡΠΊΠ΅; KV — ΠΊΠΎΠ»ΠΈΡΠ΅ΡΡΠ²ΠΎ Π²Π°ΡΠΈΠ°Π½ΡΠΎΠ² Π² ΡΠΎΠΎΡΠ²Π΅ΡΡΡΠ²ΡΡΡΠ΅ΠΉ Π³ΡΡΠΏΠΏΠ΅ ΠΊΠΎΠΌΠ°Π½Π΄.
ΠΠΎΠ»ΡΡΠΈΠ»ΠΈ ΡΠ»Π΅Π΄ΡΡΡΠΈΠ΅ ΠΊΠΎΠΌΠ°Π½Π΄Ρ: NEG, JE, ADC, SHL, INC.
ΠΠ°Π΄Π°Π½ΠΈΠ΅: ΠΠ»Ρ Π·Π°Π΄Π°Π½Π½ΠΎΠ³ΠΎ Π½Π°Π±ΠΎΡΠ° ΠΊΠΎΠΌΠ°Π½Π΄ ΡΠ°Π·ΡΠ°Π±ΠΎΡΠ°ΡΡ, ΠΎΡΠ»Π°Π΄ΠΈΡΡ ΠΈ ΠΏΡΠΎΡΠ΅ΡΡΠΈΡΠΎΠ²Π°ΡΡ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΡ — ΠΊΠΎΠΌΠΏΠΈΠ»ΡΡΠΎΡ.
1. Π Π°Π·ΡΠ°Π±ΠΎΡΠΊΠ° ΠΊΠΎΠ½ΡΡΠΎΠ»ΡΠ½ΠΎΠ³ΠΎ ΠΏΡΠΈΠΌΠ΅ΡΠ°
Myprim.asm ΡΠ²Π»ΡΠ΅ΡΡΡ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠΎΠΉ Π΄Π»Ρ Π½Π°Ρ ΠΎΠΆΠ΄Π΅Π½ΠΈΡ ΡΠ°Π·Π½ΠΈΡΡ ΠΌΠ΅ΠΆΠ΄Ρ Π΄Π²ΡΠΌΡ Π±ΠΎΠ»ΡΡΠΈΠΌΠΈ ΡΠΈΡΠ»Π°ΠΌΠΈ (32 ΡΠ°Π·ΡΡΠ΄Π°). ΠΡΠΏΠΎΠ»ΡΠ·ΡΠ΅Ρ Π²ΡΠ΅ Π·Π°Π΄Π°Π½Π½ΡΠ΅ ΠΊΠΎΠΌΠ°Π½Π΄Ρ
ADC, JE, NEG, SHL, INC ΠΈ ΠΊΡΠΎΠΌΠ΅ ΡΠΎΠ³ΠΎ ΠΊΠΎΠΌΠ°Π½Π΄Ρ MOV, INT.
datas segment; ΡΠ΅Π³ΠΌΠ΅Π½Ρ Π΄Π°Π½Π½ΡΡ
a1 dw 1001h; a1, a2, b1, b2 — ΠΈΡΡ ΠΎΠ΄Π½ΡΠ΅ Π΄Π°Π½Π½ΡΠ΅
a2 dw 10h; Ρ1, Ρ2 — ΡΠ΅Π·ΡΠ»ΡΡΠ°Ρ
b1 dw 0abcdh
b2 dw 20h
c1 dw 0
c2 dw 0
vix dw 4c00h; 4ch — Ρ-ΡΠΈΡ Π²ΡΡ ΠΎΠ΄Π°, 00h — ΠΊΠΎΠ΄ Π²ΠΎΠ·Π²ΡΠ°ΡΠ°
datas ends
codes segment
start:
assume cs: codes, ds: datas
mov ax, datas
mov ds, ax
mov ax, a1;
mov dx, a2; Π·Π°Π³ΡΡΠ·ΠΈΡΡ Π΄Π°Π½Π½ΡΠ΅ Π²
mov bx, b1; ΡΠ΅Π³ΠΈΡΡΡΡ
mov cx, b2;
neg ax;
je m1;
inc dx; ΠΈΠ½Π²Π΅ΡΡΠΈΡ ΠΏΠ΅ΡΠ²ΠΎΠ³ΠΎ ΡΠΈΡΠ»Π°
m1: neg dx;
mov di, c1; 0 -> Π±ΠΈΡ CF
shl di, 1;
adc ax, bx; ΡΠ»ΠΎΠΆΠΈΡΡ ΠΌΠ»Π°Π΄ΡΠΈΠ΅ ΡΠ°ΡΡΠΈ
adc dx, cx; ΡΠ»ΠΎΠΆΠΈΡΡ ΡΡΠ°ΡΡΠΈΠ΅ ΡΠ°ΡΡΠΈ ΠΈ Π±ΠΈΡ CF
je m2
mov c1, ax; ΡΠΎΡ ΡΠ°Π½ΠΈΡΡ
m2: mov c2, dx; ΡΠ΅Π·ΡΠ»ΡΡΠ°Ρ
mov ax, vix; Π·Π°Π²Π΅ΡΡΠ΅Π½ΠΈΠ΅
int 21h; ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΡ
codes ends
end start
ΠΠ°Ρ ΠΎΠ΄ΠΈΡΡΡ ΡΠ°Π·Π½ΠΈΡΠ° ΠΌΠ΅ΠΆΠ΄Ρ Π΄Π²ΡΠΌΡ 32-ΡΠ°Π·ΡΡΠ΄Π½ΡΠΌΠΈ ΠΎΠΏΠ΅ΡΠ°Π½Π΄Π°ΠΌΠΈ. ΠΡΠΎΡΠΎΠΉ ΠΎΠΏΠ΅ΡΠ°Π½Π΄ ΠΈΠ½Π²Π΅ΡΡΠΈΡΡΠ΅ΡΡΡ ΠΈ ΡΠΊΠ»Π°Π΄ΡΠ²Π°Π΅ΡΡΡ Ρ ΠΏΠ΅ΡΠ²ΡΠΌ. ΠΠΏΠ΅ΡΠ°Π½Π΄Ρ ΠΈ ΡΠ΅Π·ΡΠ»ΡΡΠ°Ρ ΡΠ°ΡΠΏΠΎΠ»Π°Π³Π°ΡΡΡΡ Π² ΠΏΠ°ΠΌΡΡΠΈ. ΠΠ°Π·ΠΎΠ²ΡΠΉ Π½Π°Π±ΠΎΡ ΠΊΠΎΠΌΠ°Π½Π΄ Π΄ΠΎΠΏΠΎΠ»Π½Π΅Π½ ΠΊΠΎΠΌΠ°Π½Π΄Π°ΠΌΠΈ: MOV ΠΈ INT, Π΄ΠΈΡΠ΅ΠΊΡΠΈΠ²ΠΎΠΉ — DW.
ΠΠ°Π½Π½ΡΠΉ ΠΊΠΎΠ½ΡΡΠΎΠ»ΡΠ½ΡΠΉ ΠΏΡΠΈΠΌΠ΅Ρ Π±Π΅Π· ΠΎΡΠΈΠ±ΠΎΠΊ ΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡΡΠ΅ΡΡΡ ΠΈ Π»ΠΈΠ½ΠΊΡΠ΅ΡΡΡ ΡΡΠ°Π½Π΄Π°ΡΡΠ½ΡΠΌΠΈ ΠΊΠΎΠΌΠΏΠΈΠ»ΡΡΠΎΡΠ°ΠΌΠΈ ΠΈ Π»ΠΈΠ½ΠΊΠΎΠ²ΡΠΈΠΊΠ°ΠΌΠΈ.
2. ΠΠΏΠΈΡΠ°Π½ΠΈΠ΅ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΠΌΡΡ Π΄ΠΈΡΠ΅ΠΊΡΠΈΠ² ΠΈ ΠΊΠΎΠΌΠ°Π½Π΄ Π°ΡΡΠ΅ΠΌΠ±Π»Π΅ΡΠ°
ADC: Π‘Π»ΠΎΠΆΠ΅Π½ΠΈΠ΅ Ρ ΠΏΠ΅ΡΠ΅Π½ΠΎΡΠΎΠΌ
ΠΠΏΠ΅ΡΠ°ΡΠΈΡ: ΠΠ±ΡΡΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΡΡΡ ΠΏΡΠΈ ΡΠ»ΠΎΠΆΠ΅Π½ΠΈΠΈ ΠΌΠ½ΠΎΠ³ΠΎΡΠ»ΠΎΠ²Π½ΡΡ Π²Π΅Π»ΠΈΡΠΈΠ½ Π΄Π»Ρ ΡΡΠ΅ΡΠ° Π±ΠΈΡΠ° ΠΏΠ΅ΡΠ΅ΠΏΠΎΠ»Π½Π΅Π½ΠΈΡ Π² ΠΏΠΎΡΠ»Π΅Π΄ΡΡΡΠΈΡ ΡΠ°Π·Π°Ρ ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠΈ. ΠΡΠ»ΠΈ ΡΠ»Π°Π³ CF ΡΡΡΠ°Π½ΠΎΠ²Π»Π΅Π½ Π² 1, ΡΠΎ ΠΊΠΎΠΌΠ°Π½Π΄Π° ADC ΡΠ½Π°ΡΠ°Π»Π° ΠΏΡΠΈΠ±Π°Π²Π»ΡΠ΅Ρ 1 ΠΊ ΠΎΠΏΠ΅ΡΠ°Π½Π΄Ρ 1. ΠΠΎΠΌΠ°Π½Π΄Π° Π²ΡΠ΅Π³Π΄Π° ΠΏΡΠΈΠ±Π°Π²Π»ΡΠ΅Ρ ΠΎΠΏΠ΅ΡΠ°Π½Π΄ 2 ΠΊ ΠΎΠΏΠ΅ΡΠ°Π½Π΄Ρ 1, Π°Π½Π°Π»ΠΎΠ³ΠΈΡΠ½ΠΎ ΠΊΠΎΠΌΠ°Π½Π΄Π΅ ADD.
Π€Π»Π°Π³ΠΈ: ΠΠΎΠΌΠ°Π½Π΄Π° Π²ΠΎΠ·Π΄Π΅ΠΉΡΡΠ²ΡΠ΅Ρ Π½Π° ΡΠ»Π°Π³ΠΈ AF, CF, OF, PF, SF ΠΈ ZF.
ΠΠ±ΡΠ΅ΠΊΡΠ½ΡΠΉ ΠΊΠΎΠ΄ (ΡΡΠΈ ΡΠΎΡΠΌΠ°ΡΠ°): Π Π΅Π³ΠΈΡΡΡ ΠΏΠ»ΡΡ ΡΠ΅Π³ΠΈΡΡΡ ΠΈΠ»ΠΈ ΠΏΠ°ΠΌΡΡΡ:|100dw|modregr/m|.
INT: ΠΡΠ΅ΡΡΠ²Π°Π½ΠΈΠ΅
ΠΠΏΠ΅ΡΠ°ΡΠΈΡ: ΠΡΠ΅ΡΡΠ²Π°Π΅Ρ Π²ΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΡ ΠΈ ΠΏΠ΅ΡΠ΅Π΄Π°Π΅Ρ ΡΠΏΡΠ°Π²Π»Π΅Π½ΠΈΠ΅ ΠΏΠΎ ΠΎΠ΄Π½ΠΎΠΌΡ ΠΈΠ· 256 Π°Π΄ΡΠ΅ΡΠΎΠ² (Π²Π΅ΠΊΡΠΎΡΠΎΠ² ΠΏΡΠ΅ΡΡΠ²Π°Π½ΠΈΡ). ΠΠΎΠΌΠ°Π½Π΄Π° INT Π²ΡΠΏΠΎΠ»Π½ΡΠ΅Ρ ΡΠ»Π΅Π΄ΡΡΡΠ΅Π΅: 1) ΡΠΌΠ΅Π½ΡΡΠ°Π΅Ρ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ SP Π½Π° 2 ΠΈ Π·Π°Π½ΠΎΡΠΈΡ Π² ΡΡΠ΅ΠΊ ΡΠ»Π°Π³ΠΎΠ²ΡΠΉ ΡΠ΅Π³ΠΈΡΡΡ, ΡΠ±ΡΠ°ΡΡΠ²Π°Π΅Ρ ΡΠ»Π°Π³ΠΈ IF ΠΈ TF; 2) ΡΠΌΠ΅Π½ΡΡΠ°Π΅Ρ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ SP Π½Π° 2 ΠΈ Π·Π°Π½ΠΎΡΠΈΡ ΡΠ΅Π³ΠΈΡΡΡ CS Π² ΡΡΠ΅ΠΊ, ΡΡΠ°ΡΡΠ΅Π΅ ΡΠ»ΠΎΠ²ΠΎ ΠΈΠ· Π²Π΅ΠΊΡΠΎΡΠ° ΠΏΡΠ΅ΡΡΠ²Π°Π½ΠΈΡ ΠΏΠΎΠΌΠ΅ΡΠ°Π΅Ρ Π² ΡΠ΅Π³ΠΈΡΡΡ CS; 3) ΡΠΌΠ΅Π½ΡΡΠ°Π΅Ρ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ SP Π½Π° 2 ΠΈ Π·Π°Π½ΠΎΡΠΈΡ ΡΠ΅Π³ΠΈΡΡΡ IP Π² ΡΡΠ΅ΠΊ, ΠΌΠ»Π°Π΄ΡΠ΅Π΅ ΡΠ»ΠΎΠ²ΠΎ ΠΈΠ· Π²Π΅ΠΊΡΠΎΡΠ° ΠΏΡΠ΅ΡΡΠ²Π°Π½ΠΈΡ ΠΏΠΎΠΌΠ΅ΡΠ°Π΅Ρ Π² ΡΠ΅Π³ΠΈΡΡΡ IP.
Π€Π»Π°Π³ΠΈ: ΠΠΎΠΌΠ°Π½Π΄Π° Π²ΠΎΠ·Π΄Π΅ΠΉΡΡΠ²ΡΠ΅Ρ Π½Π° ΡΠ»Π°Π³ΠΈ IF ΠΈ TF.
ΠΠ±ΡΠ΅ΠΊΡΠ½ΡΠΉ ΠΊΠΎΠ΄: |110 0110v|-type-| (Π΅ΡΠ»ΠΈ v = 0, ΡΠΎ type = 3).
INT const: ΠΡΠ΅ΡΡΠ²Π°Π½ΠΈΠ΅
ΠΠΏΠ΅ΡΠ°ΡΠΈΡ: ΠΡΠ΅ΡΡΠ²Π°Π΅Ρ Π²ΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΡ ΠΈ ΠΏΠ΅ΡΠ΅Π΄Π°ΡΡ ΡΠΏΡΠ°Π²Π»Π΅Π½ΠΈΠ΅ ΠΏΠΎ ΠΎΠ΄Π½ΠΎΠΌΡ ΠΈΠ· 256 Π°Π΄ΡΠ΅ΡΠΎΠ² (Π²Π΅ΠΊΡΠΎΡΠΎΠ² ΠΏΡΠ΅ΡΡΠ²Π°Π½ΠΈΡ).
ΠΠ±ΡΠ΅ΠΊΡΠ½ΡΠΉ ΠΊΠΎΠ΄: |11 001 101|-type-|.
JE/JZ: ΠΠ΅ΡΠ΅Ρ ΠΎΠ΄ ΠΏΠΎ «ΡΠ°Π²Π½ΠΎ» ΠΈΠ»ΠΈ ΠΏΠΎ «Π½ΡΠ»Ρ»
ΠΠΏΠ΅ΡΠ°ΡΠΈΡ: ΠΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΡΡΡ ΠΏΠΎΡΠ»Π΅ ΠΏΡΠΎΠ²Π΅ΡΠΊΠΈ Π·Π½Π°ΠΊΠΎΠ²ΡΡ ΠΈΠ»ΠΈ Π±Π΅Π·Π·Π½Π°ΠΊΠΎΠ²ΡΡ Π΄Π°Π½Π½ΡΡ Π΄Π»Ρ ΠΏΠ΅ΡΠ΅Π΄Π°ΡΠΈ ΡΠΏΡΠ°Π²Π»Π΅Π½ΠΈΡ ΠΏΠΎ Π΄ΡΡΠ³ΠΎΠΌΡ Π°Π΄ΡΠ΅ΡΡ. ΠΡΠ»ΠΈ ΡΠ»Π°Π³ ZF ΡΠ°Π²Π΅Π½ Π΅Π΄ΠΈΠ½ΠΈΡΠ΅ (Π½ΡΠ»Π΅Π²ΠΎΠ΅ ΡΠΎΡΡΠΎΡΠ½ΠΈΠ΅), ΡΠΎ ΠΊΠΎΠΌΠ°Π½Π΄Π° ΠΏΡΠΈΠ±Π°Π²Π»ΡΠ΅Ρ ΠΊ ΡΠ΅Π³ΠΈΡΡΡΡ IP Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ ΠΎΠΏΠ΅ΡΠ°Π½Π΄Π° (ΠΎΡΠ½ΠΎΡΠΈΡΠ΅Π»ΡΠ½ΠΎΠ΅ ΡΠΌΠ΅ΡΠ΅Π½ΠΈΠ΅) ΠΈ Π²ΡΠΏΠΎΠ»Π½ΡΠ΅Ρ ΡΠ°ΠΊΠΈΠΌ ΠΎΠ±ΡΠ°Π·ΠΎΠΌ ΠΏΠ΅ΡΠ΅Ρ ΠΎΠ΄.
Π€Π»Π°Π³ΠΈ: ΠΠ΅ ΠΌΠ΅Π½ΡΡΡΡΡ.
ΠΠ±ΡΠ΅ΠΊΡΠ½ΡΠΉ ΠΊΠΎΠ΄: |1 110 100|-disp-|
MOV: ΠΠ΅ΡΠ΅ΡΡΠ»ΠΊΠ° Π΄Π°Π½Π½ΡΡ
ΠΠΏΠ΅ΡΠ°ΡΠΈΡ: ΠΠ΅ΡΠ΅ΡΡΠ»Π°Π΅Ρ ΠΎΠ΄ΠΈΠ½ Π±Π°ΠΉΡ ΠΈΠ»ΠΈ ΠΎΠ΄Π½ΠΎ ΡΠ»ΠΎΠ²ΠΎ ΠΌΠ΅ΠΆΠ΄Ρ ΡΠ΅Π³ΠΈΡΡΡΠ°ΠΌΠΈ ΠΈΠ»ΠΈ ΠΌΠ΅ΠΆΠ΄Ρ ΡΠ΅Π³ΠΈΡΡΡΠΎΠΌ ΠΈ ΠΏΠ°ΠΌΡΡΡΡ, Π° ΡΠ°ΠΊΠΆΠ΅ ΠΏΠ΅ΡΠ΅Π΄Π°Π΅Ρ Π½Π΅ΠΏΠΎΡΡΠ΅Π΄ΡΡΠ²Π΅Π½Π½ΠΎΠ΅ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ Π² ΡΠ΅Π³ΠΈΡΡΡ ΠΈΠ»ΠΈ Π² ΠΏΠ°ΠΌΡΡΡ. ΠΠΎΠΌΠ°Π½Π΄Π° MOV Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ ΠΏΠ΅ΡΠ΅Π΄Π°Π²Π°ΡΡ Π΄Π°Π½Π½ΡΠ΅ ΠΌΠ΅ΠΆΠ΄Ρ Π΄Π²ΡΠΌΡ Π°Π΄ΡΠ΅ΡΠ°ΠΌΠΈ ΠΏΠ°ΠΌΡΡΠΈ (Π΄Π»Ρ ΡΡΠΎΠΉ ΡΠ΅Π»ΠΈ ΡΠ»ΡΠΆΠΈΡ ΠΊΠΎΠΌΠ°Π½Π΄Π° MOVS). Π‘ΡΡΠ΅ΡΡΠ²ΡΠ΅Ρ ΡΠ΅ΠΌΡ ΡΠΈΠΏΠΎΠ² ΠΊΠΎΠΌΠ°Π½Π΄Ρ MOV.
Π€Π»Π°Π³ΠΈ: ΠΠ΅ ΠΌΠ΅Π½ΡΡΡΡΡ.
ΠΠ±ΡΠ΅ΠΊΡΠ½ΡΠΉ ΠΊΠΎΠ΄ (ΡΠ΅ΠΌΡ ΡΠΎΡΠΌΠ°ΡΠΎΠ²):
Π Π΅Π³ΠΈΡΡΡ/ΠΏΠ°ΠΌΡΡΡ Π²/ΠΈΠ· ΡΠ΅Π³ΠΈΡΡΡ:
|10 0010dw|modregr/m|
ΠΠ΅ΠΏΠΎΡΡΠ΅Π΄ΡΡΠ²Π΅Π½Π½ΠΎΠ΅ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ Π² ΡΠ΅Π³ΠΈΡΡΡ:
|1011wreg|-data-|data Π΅ΡΠ»ΠΈ w=1|
ΠΠ°ΠΌΡΡΡ Π² ΡΠ΅Π³ΠΈΡΡΡ AX (AL):
|101 0000w|addr-low|addr-high|
Π Π΅Π³ΠΈΡΡΡ AX (AL) Π² ΠΏΠ°ΠΌΡΡΡ:
|101 0001w|addr-low|addr-high|
Π Π΅Π³ΠΈΡΡΡ/ΠΏΠ°ΠΌΡΡΡ Π² ΡΠ΅Π³ΠΌΠ΅Π½ΡΠ½ΡΠΉ ΡΠ΅Π³ΠΈΡΡΡ:
|10 001 110|mod0sgr/m| (sg — ΡΠ΅Π³ΠΌΠ΅Π½ΡΠ½ΡΠΉ ΡΠ΅Π³ΠΈΡΡΡ)
NEG: ΠΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ Π·Π½Π°ΠΊΠ° ΡΠΈΡΠ»Π°
ΠΠΏΠ΅ΡΠ°ΡΠΈΡ: ΠΠ΅Π½ΡΠ΅Ρ Π΄Π²ΠΎΠΈΡΠ½ΠΎΠ΅ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ ΠΈΠ· ΠΏΠΎΠ»ΠΎΠΆΠΈΡΠ΅Π»ΡΠ½ΠΎΠ³ΠΎ Π² ΠΎΡΡΠΈΡΠ°ΡΠ΅Π»ΡΠ½ΠΎΠ΅ ΠΈ ΠΈΠ· ΠΎΡΡΠΈΡΠ°ΡΠ΅Π»ΡΠ½ΠΎΠ³ΠΎ Π² ΠΏΠΎΠ»ΠΎΠΆΠΈΡΠ΅Π»ΡΠ½ΠΎΠ΅. ΠΠΎΠΌΠ°Π½Π΄Π° NEG Π²ΡΡΠΈΡΠ»ΡΠ΅Ρ Π΄Π²ΠΎΠΈΡΠ½ΠΎΠ΅ Π΄ΠΎΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ ΠΎΡ ΡΠΊΠ°Π·Π°Π½Π½ΠΎΠ³ΠΎ ΠΎΠΏΠ΅ΡΠ°Π½Π΄Π°: Π²ΡΡΠΈΡΠ°Π΅Ρ ΠΎΠΏΠ΅ΡΠ°Π½Π΄ ΠΈΠ· Π½ΡΠ»Ρ ΠΈ ΠΏΡΠΈΠ±Π°Π²Π»ΡΠ΅Ρ Π΅Π΄ΠΈΠ½ΠΈΡΡ. ΠΠΏΠ΅ΡΠ°Π½Π΄ΠΎΠΌ ΠΌΠΎΠΆΠ΅Ρ Π±ΡΡΡ Π±Π°ΠΉΡ ΠΈΠ»ΠΈ ΡΠ»ΠΎΠ²ΠΎ Π² ΡΠ΅Π³ΠΈΡΡΡΠ΅ ΠΈΠ»ΠΈ Π² ΠΏΠ°ΠΌΡΡΠΈ.
Π€Π»Π°Π³ΠΈ: ΠΠΎΠΌΠ°Π½Π΄Π° Π²ΠΎΠ·Π΄Π΅ΠΉΡΡΠ²ΡΠ΅Ρ Π½Π° ΡΠ»Π°Π³ΠΈ AF, CF, OF, PF, SF ΠΈ ZF.
ΠΠ±ΡΠ΅ΠΊΡΠ½ΡΠΉ ΠΊΠΎΠ΄: |111 1011w|mod011r/m|
SHL: Π‘Π΄Π²ΠΈΠ³ Π²Π»Π΅Π²ΠΎ ΠΈΠ»ΠΈ Π²ΠΏΡΠ°Π²ΠΎ
ΠΠΏΠ΅ΡΠ°ΡΠΈΡ: ΠΡΠΏΠΎΠ»Π½ΡΠ΅Ρ ΡΠ΄Π²ΠΈΠ³ Π±ΠΈΡΠΎΠ² Π²Π»Π΅Π²ΠΎ.
Π€Π»Π°Π³ΠΈ: ΠΠΎΠΌΠ°Π½Π΄Π° Π²ΠΎΠ·Π΄Π΅ΠΉΡΡΠ²ΡΠ΅Ρ Π½Π° ΡΠ»Π°Π³ΠΈ CF, OF, PF, SF ΠΈ ZF (ΡΠ»Π°Π³ AF Π½Π΅ ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½).
ΠΠ±ΡΠ΅ΠΊΡΠ½ΡΠΉ ΠΊΠΎΠ΄: SAL/SHL: |11 0100cw|mod100r/m|.
3. ΠΠ»Π³ΠΎΡΠΈΡΠΌΡ ΠΈ ΡΠ°Π±Π»ΠΈΡΡ ΠΊΠΎΠΌΠΏΠΈΠ»ΡΡΠΎΡΠ°
ΠΠΎΠΌΠΏΠΈΠ»ΡΡΠΎΡ, ΡΠ°Π·ΡΠ°Π±Π°ΡΡΠ²Π°Π΅ΠΌΡΠΉ Π² Π΄Π°Π½Π½ΠΎΠΉ ΠΊΡΡΡΠΎΠ²ΠΎΠΉ, ΡΠ²Π»ΡΠ΅ΡΡΡ Π΄Π²ΡΡ -ΠΏΡΠΎΡ ΠΎΠ΄Π½ΡΠΌ. ΠΠ½ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅Ρ ΡΠ»Π΅Π΄ΡΡΡΠΈΠ΅ ΡΠΈΡΡΠ΅ΠΌΠ½ΡΠ΅ ΡΠ°Π±Π»ΠΈΡΡ.
OPTAB — ΡΠ°Π±Π»ΠΈΡΠ° ΠΌΠ½Π΅ΠΌΠΎΠΊΠΎΠ΄ΠΎΠ². Π‘ΠΎΠ΄Π΅ΡΠΆΠΈΡ ΡΠ»Π΅Π΄ΡΡΡΠΈΠ΅ ΠΏΠΎΠ»Ρ: name — ΠΌΠ½Π΅ΠΌΠΎΠΊΠΎΠ΄. SYMTAB — ΡΠ°Π±Π»ΠΈΡΠ° ΡΠΈΠΌΠ²ΠΎΠ»ΠΈΡΠ΅ΡΠΊΠΈΡ ΠΈΠΌΡΠ½. Π‘ΠΎΠ΄Π΅ΡΠΆΠΈΡ ΡΠ»Π΅Π΄ΡΡΡΠΈΠ΅ ΠΏΠΎΠ»Ρ: name — ΡΠΈΠΌΠ²ΠΎΠ»ΠΈΡΠ΅ΡΠΊΠΎΠ΅ ΠΈΠΌΡ; sgm — ΡΠ΅Π³ΠΌΠ΅Π½Ρ, Π² ΠΊΠΎΡΠΎΡΠΎΠΌ ΠΎΠ½ΠΎ ΠΎΠ±ΡΡΠ²Π»Π΅Π½ΠΎ; dsp — ΡΠΌΠ΅ΡΠ΅Π½ΠΈΠ΅ Π² ΡΠ΅Π³ΠΌΠ΅Π½ΡΠ΅. SEGTAB — ΡΠ°Π±Π»ΠΈΡΠ° ΡΠ΅Π³ΠΌΠ΅Π½ΡΠΎΠ². Π‘ΠΎΠ΄Π΅ΡΠΆΠΈΡ ΡΠ»Π΅Π΄ΡΡΡΠΈΠ΅ ΠΏΠΎΠ»Ρ: name — ΠΈΠΌΡ ΡΠ΅Π³ΠΌΠ΅Π½ΡΠ°; len — Π΄Π»ΠΈΠ½Π° ΡΠ΅Π³ΠΌΠ΅Π½ΡΠ° Π² Π±Π°ΠΉΡΠ°Ρ .
ΠΡΠΎΠΌΠ΅ Π²ΡΡΠ΅ ΠΏΠ΅ΡΠ΅ΡΠΈΡΠ»Π΅Π½Π½ΡΡ ΡΠ°Π±Π»ΠΈΡ, ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΡΡΡΡ Π΄Π²Π° Π²ΡΠ΅ΠΌΠ΅Π½Π½ΡΡ ΡΠ°ΠΉΠ»Π° ΠΏΡΠ΅Π΄Π½Π°Π·Π½Π°ΡΠ΅Π½Π½ΡΡ Π΄Π»Ρ Ρ ΡΠ°Π½Π΅Π½ΠΈΡ ΠΎΠ±ΡΠ΅ΠΊΡΠ½ΠΎΠ³ΠΎ ΠΊΠΎΠ΄ Π΄Π²ΡΡ ΡΠ΅Π³ΠΌΠ΅Π½ΡΠΎΠ². Π’Π°ΠΊΠΆΠ΅ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΡΡΡ ΡΠ°Π±Π»ΠΈΡΠ° modif ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΠΌΡΡ ΡΡΡΠ»ΠΎΠΊ (Π·Π°ΠΏΠΈΡΠΈ ΠΌΠΎΠ΄ΠΈΡΠΈΠΊΠ°ΡΠΎΡΡ).
ΠΠ° ΠΏΠ΅ΡΠ²ΠΎΠΌ ΠΏΡΠΎΡ ΠΎΠ΄Π΅ ΠΏΡΠΎΠΈΡΡ ΠΎΠ΄ΠΈΡ Π·Π°ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ ΡΠ°Π±Π»ΠΈΡΡ ΡΠΈΠΌΠ²ΠΎΠ»ΠΈΡΠ΅ΡΠΊΠΈΡ ΠΈΠΌΡΠ½ ΠΈ ΡΠ°Π±Π»ΠΈΡΡ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΠΌΡΡ ΡΠ΅Π³ΠΌΠ΅Π½ΡΠΎΠ². ΠΡΠΎΠΌΠ΅ ΡΠΎΠ³ΠΎ, ΠΎΠΏΡΠ΅Π΄Π΅Π»ΡΡΡΡΡ ΡΠΎΡΠΌΠ°ΡΡ ΠΊΠΎΠΌΠ°Π½Π΄, Π±Π΅Π· ΡΠ΅Π³ΠΎ Π½Π΅Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ Π·Π°ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ ΡΠΈΡΡΠ΅ΠΌΠ½ΡΡ ΡΠ°Π±Π»ΠΈΡ. ΠΠ½Π΅ΠΌΠΎΠΊΠΎΠ΄Ρ ΠΎΠ±ΡΠ°Π±Π°ΡΡΠ²Π°ΡΡΡΡ ΡΠ»Π΅Π΄ΡΡΡΠΈΠΌ ΠΎΠ±ΡΠ°Π·ΠΎΠΌ. ΠΡΡ ΡΡΡΠΎΠΊΠ° ΡΠ°Π·Π±ΠΈΠ²Π°Π΅ΡΡΡ Π½Π° ΠΏΠΎΠ»Ρ. ΠΡΠ»ΠΈ Π² ΡΡΡΠΎΠΊΠ΅ ΠΈΠΌΠ΅Π΅ΡΡΡ ΡΠΈΠΌΠ²ΠΎΠ»ΠΈΡΠ΅ΡΠΊΠΎΠ΅ ΠΈΠΌΡ, ΡΠΎ ΠΎΠ½ΠΎ Π·Π°Π½ΠΎΡΠΈΡΡΡ Π² ΡΠ°Π±Π»ΠΈΡΡ. ΠΠ°Π»Π΅Π΅ ΠΎΠΏΡΠ΅Π΄Π΅Π»ΡΠ΅ΡΡΡ ΠΏΠΎΠ»Π΅ Ρ ΠΌΠ½Π΅ΠΌΠΎΠΊΠΎΠ΄ΠΎΠΌ. Π ΡΠ°Π±Π»ΠΈΡΠ΅ ΠΌΠ½Π΅ΠΌΠΎΠΊΠΎΠ΄ΠΎΠ² ΠΎΡΡΡΠΊΠΈΠ²Π°Π΅ΡΡΡ Π΄Π°Π½Π½ΡΠΉ ΠΌΠ½Π΅ΠΌΠΎΠΊΠΎΠ΄ ΠΈ ΠΎΠΏΡΠ΅Π΄Π΅Π»ΡΠ΅ΡΡΡ ΠΈΠ½Π΄Π΅ΠΊΡ ΠΎΠ±ΡΠ°Π±ΠΎΡΡΠΈΠΊΠ°. ΠΡΠ»ΠΈ ΠΌΠ½Π΅ΠΌΠΎΠΊΠΎΠ΄ Π² ΡΠ°Π±Π»ΠΈΡΠ΅ ΠΎΡΡΡΡΡΡΠ²ΡΠ΅Ρ, ΡΠΎ Π³Π΅Π½Π΅ΡΠΈΡΡΠ΅ΡΡΡ ΠΎΡΠΈΠ±ΠΊΠ°. ΠΠΎΡΠ»Π΅ ΡΠΎΠ³ΠΎ, ΠΊΠ°ΠΊ ΠΈΠ½Π΄Π΅ΠΊΡ ΠΏΠΎΠ»ΡΡΠ΅Π½, ΠΎΠ±ΡΠ°Π±ΠΎΡΠΊΠ° ΡΡΡΠΎΠΊΠΈ ΠΏΠ΅ΡΠ΅Π΄Π°ΡΡΡΡ ΡΠΎΠΎΡΠ²Π΅ΡΡΡΠ²ΡΡΡΠ΅ΠΌΡ ΠΎΠ±ΡΠ°Π±ΠΎΡΡΠΈΠΊΡ. ΠΠ° Π΄Π°Π½Π½ΠΎΠΌ ΠΏΡΠΎΡ ΠΎΠ΄Π΅ ΠΎΠ±ΡΠ°Π±ΠΎΡΡΠΈΠΊ ΠΎΠΏΡΠ΅Π΄Π΅Π»ΡΠ΅Ρ ΡΠΎΡΠΌΠ°Ρ ΠΊΠΎΠΌΠ°Π½Π΄Ρ (Π² ΡΠ°ΡΡΠ½ΠΎΡΡΠΈ Π΅Ρ Π΄Π»ΠΈΠ½Ρ) ΠΈ ΡΠΎΠΎΡΠ²Π΅ΡΡΡΠ²ΡΡΡΠΈΠΌ ΠΎΠ±ΡΠ°Π·ΠΎΠΌ ΠΈΠ·ΠΌΠ΅Π½ΡΠ΅Ρ ΡΡΡΡΡΠΈΠΊ ΡΠ°Π·ΠΌΠ΅ΡΠ΅Π½ΠΈΡ.
Π Π½Π°ΡΠ°Π»Ρ Π²ΡΠΎΡΠΎΠ³ΠΎ ΠΏΡΠΎΡ ΠΎΠ΄Π° Π°Π΄ΡΠ΅ΡΠ° Π²ΡΠ΅Ρ ΡΠΈΠΌΠ²ΠΎΠ»ΠΈΡΠ΅ΡΠΊΠΈΡ ΠΈΠΌΡΠ½ ΠΈΠ·Π²Π΅ΡΡΠ½Ρ. ΠΠΎ Π²ΡΠ΅ΠΌΡ Π²ΡΠΎΡΠΎΠ³ΠΎ ΠΏΡΠΎΡ ΠΎΠ΄Π° ΠΎΠΊΠΎΠ½ΡΠ°ΡΠ΅Π»ΡΠ½ΠΎ Π³Π΅Π½Π΅ΡΠΈΡΡΡΡΡΡ ΠΎΠ±ΡΠ΅ΠΊΡΠ½ΡΠ΅ ΠΊΠΎΠ΄Ρ ΠΊΠΎΠΌΠ°Π½Π΄. ΠΡΠ»ΠΈ Π² ΠΊΠΎΠΌΠ°Π½Π΄Π΅ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΡΡΡ ΡΠΈΠΌΠ²ΠΎΠ»ΠΈΡΠ΅ΡΠΊΠΎΠ΅ ΠΈΠΌΡ, ΡΠΎ ΠΎΠ½ΠΎ ΠΎΡΡΡΠΊΠΈΠ²Π°Π΅ΡΡΡ Π² ΡΠ°Π±Π»ΠΈΡΠ΅ ΡΠΈΠΌΠ²ΠΎΠ»ΠΈΡΠ΅ΡΠΊΠΈΡ ΠΈΠΌΡΠ½, ΠΈ Π² ΡΠΎΠΎΡΠ²Π΅ΡΡΡΠ²ΡΡΡΠ΅Π΅ ΠΏΠΎΠ»Π΅ ΠΎΠ±ΡΠ΅ΠΊΡΠ½ΠΎΠ³ΠΎ ΠΊΠΎΠ΄Π° Π·Π°ΠΏΠΈΡΡΠ²Π°Π΅ΡΡΡ Π½ΡΠΆΠ½ΠΎΠ΅ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ (ΡΡΠΎ ΠΌΠΎΠΆΠ΅Ρ Π±ΡΡΡ Π°Π΄ΡΠ΅Ρ ΡΠΈΠΌΠ²ΠΎΠ»ΠΈΡΠ΅ΡΠΊΠΎΠ³ΠΎ ΠΈΠΌΠ΅Π½ΠΈ ΠΈΠ»ΠΈ ΡΠΌΠ΅ΡΠ΅Π½ΠΈΠ΅ Π΄ΠΎ Π΄Π°Π½Π½ΠΎΠ³ΠΎ ΠΈΠΌΠ΅Π½ΠΈ Π² Π·Π°Π²ΠΈΡΠΈΠΌΠΎΡΡΠΈ ΠΎΡ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΠΌΠΎΠΉ ΠΊΠΎΠΌΠ°Π½Π΄Ρ). ΠΠ±ΡΠ΅ΠΊΡΠ½ΡΠΉ ΠΊΠΎΠ΄ Π·Π°ΠΏΠΈΡΡΠ²Π°Π΅ΡΡΡ Π² Π²ΡΠΏΠΎΠΌΠΎΠ³Π°ΡΠ΅Π»ΡΠ½ΡΠ΅ ΡΠ°ΠΉΠ»Ρ. ΠΡΠΎΠΌΠ΅ ΡΠΎΠ³ΠΎ, Π΅ΡΠ»ΠΈ ΠΎΠ±ΡΠ΅ΠΊΡΠ½ΡΠΉ ΠΊΠΎΠ΄ ΡΠΎΠ΄Π΅ΡΠΆΠΈΡ ΠΏΠΎΠ»Π΅, Π½ΡΠΆΠ΄Π°ΡΡΠ΅Π΅ΡΡ Π² ΠΌΠΎΠ΄ΠΈΡΠΈΠΊΠ°ΡΠΈΠΈ, ΡΠΎ Π² ΡΠ°Π±Π»ΠΈΡΡ vmodif Π·Π°ΠΏΠΈΡΡΠ²Π°Π΅ΡΡΡ Π·Π°ΠΏΠΈΡΡ-ΠΌΠΎΠ΄ΠΈΡΠΈΠΊΠ°ΡΠΎΡ.
Π‘ΠΎΡΡΠ°Π²Π»Π΅Π½ΠΈΠ΅ ΠΎΠ±ΡΠ΅ΠΊΡΠ½ΠΎΠ³ΠΎ ΡΠ°ΠΉΠ»Π°.
ΠΠΎ ΠΎΠΊΠΎΠ½ΡΠ°Π½ΠΈΠΈ Π²ΡΠΎΡΠΎΠ³ΠΎ ΠΏΡΠΎΡ ΠΎΠ΄Π° ΠΈΠΌΠ΅Π΅ΡΡΡ Π²ΡΡ Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠ°Ρ ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΡ Π΄Π»Ρ ΡΠΎΠ³ΠΎ, ΡΡΠΎΠ±Ρ ΡΠΎΡΡΠ°Π²ΠΈΡΡ ΠΎΠ±ΡΠ΅ΠΊΡΠ½ΡΠΉ ΡΠ°ΠΉΠ». ΠΠ°ΠΏΠΈΡΠΈ, ΡΠ²Π»ΡΡΡΠΈΠ΅ΡΡ Π½Π΅ΠΈΠ·ΠΌΠ΅Π½Π½ΡΠΌΠΈ Π΄Π»Ρ Π²ΡΠ΅Ρ ΠΎΠ±ΡΠ΅ΠΊΡΠ½ΡΡ ΡΠ°ΠΉΠ»ΠΎΠ², Π·Π°ΠΏΠΈΡΡΠ²Π°ΡΡΡΡ Π² Π²ΠΈΠ΄Π΅ ΠΊΠΎΠ½ΡΡΠ°Π½Ρ. ΠΡΡΠ°Π»ΡΠ½ΡΠ΅ Π·Π°ΠΏΠΈΡΠΈ ΡΠΎΡΠΌΠΈΡΡΡΡΡΡ Π½Π° ΠΎΡΠ½ΠΎΠ²Π°Π½ΠΈΠΈ ΡΠ΅Ρ Π΄Π°Π½Π½ΡΡ , ΠΊΠΎΡΠΎΡΡΠ΅ Π±ΡΠ»ΠΈ ΠΏΠΎΠ»ΡΡΠ΅Π½Ρ Π² ΡΠ΅Π·ΡΠ»ΡΡΠ°ΡΠ΅ ΠΏΠ΅ΡΠ²ΡΡ Π΄Π²ΡΡ ΠΏΡΠΎΡ ΠΎΠ΄ΠΎΠ².
4. ΠΡΡ ΠΎΠ΄Π½ΡΠΉ ΡΠ΅ΠΊΡΡ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΡ ΠΊΠΎΠΌΠΏΠΈΠ»ΡΡΠΎΡΠ°
#include;
#include;
#include;
#include;
#include;
#include;
char i, c, npr, seg, cnt, pmdf, psym, stk[80], pole[4] [8];
//npr — Π½ΠΎΠΌΠ΅Ρ ΠΏΡΠΎΡ ΠΎΠ΄Π°, seg — Π½ΠΎΠΌΠ΅Ρ ΡΠ΅Π³ΠΌΠ΅Π½ΡΠ°, cnt — ΡΡΠ΅ΡΡΠΈΠΊ ΡΠ°Π·ΠΌΠ΅ΡΠ΅Π½ΠΈΡ ΠΊΠΎΠΌΠ°Π½Π΄
//pmdf — ΡΠΊΠ°Π·Π°ΡΠ΅Π»Ρ Π½Π° ΠΊΠΎΠ½Π΅Ρ Π·Π°ΠΏΠΈΡΠΈ ΠΌΠΎΠ΄ΠΈΡΠΈΠΊΠ°ΡΠΎΡΠ°, psym — ΡΠΊΠ°Π·Π°ΡΠ΅Π»Ρ Π½Π° ΠΊΠΎΠ½Π΅Ρ
// ΡΠ°Π±Π»ΠΈΡΡ ΠΌΠ΅ΡΠΎΠΊ, stk — ΡΡΠ΄Π° ΡΡΠΈΡΡΠ²Π°Π΅ΡΡΡ ΡΡΡΠΎΠΊΠ°, pole — ΠΏΠΎΠ»Ρ ΠΏΠΎΠ»ΡΡΠ΅Π½Π½ΡΠ΅ ΠΈΠ·
// ΡΡΠΈΡΠ°Π½Π½ΠΎΠΉ ΡΡΡΠΎΠΊΠΈ.
char optab[8] [4]={{"mov"}, {"neg"}, {"je"}, {"inc"}, // ΡΠ°Π±Π»ΠΈΡΠ°
{"shl"}, {"adc"}, {"int"}, {"dw"}}, // ΠΌΠ½Π΅ΠΌΠΎΠΊΠΎΠ΄ΠΎΠ²
regtab[8] [3]={{"ax"}, {"cx"}, {"dx"}, {"bx"}, // ΡΠ°Π±Π»ΠΈΡΡ ΠΎΠ±ΠΎΠ·Π½Π°ΡΠ΅Π½ΠΈΠΉ
{"sp"}, {"bp"}, {"si"}, {"di"}}, // ΡΠ΅Π³ΠΈΡΡΡΠΎΠ² ΠΈ
segrtab[4] [3]={{"es"}, {"cs"}, {"ss"}, {"ds"}}, // ΡΠ΅Π³ΠΌΠ΅Π½ΡΠ½ΡΡ ΡΠ΅Π³ΠΈΡΡΡΠΎΠ²
hextab[17]={"12 345 6789abcdef"},
modif[20]; // ΡΠ°Π±Π»ΠΈΡΠ° ΠΌΠΎΠ΄ΠΈΡΠΈΠΊΠ°ΡΠΎΡΠΎΠ²
struct segt {
char name[8];
char len;
};
segt segtab[2]; // ΡΠ°Π±Π»ΠΈΡΠ° ΡΠ΅Π³ΠΌΠ΅Π½ΡΠΎΠ²
struct symt {
char name[8];
char sgm;
int dsp;
};
symt symtab[10]; // ΡΠ°Π±Π»ΠΈΡΠ° ΠΌΠ΅ΡΠΎΠΊ
void stk2pol (char st[80], char pol[4] [8]); // ΡΠ°Π·Π±ΠΈΠ΅Π½ΠΈΠ΅ ΡΡΡΠΎΠΊΠΈ Π½Π° ΠΏΠΎΠ»Ρ
char findop (char op[8]); // ΠΏΠΎΠΈΡΠΊ ΠΌΠ½Π΅ΠΌΠΎΠΊΠΎΠ΄Π° Π² OPTAB
char op2code (char nmb, char dis, char pol[4] [8], char code[4]);
// Π½Π° Π²Ρ ΠΎΠ΄Π΅ ΠΌΠ½Π΅ΠΌΠΎΠΊΠΎΠ΄, Π½Π° Π²ΡΡ ΠΎΠ΄Π΅ Π΄Π»ΠΈΠ½Π½Π° ΠΊΠΎΠΌΠ°Π½Π΄Ρ ΠΈ ΠΎΠ±ΡΠ΅ΠΊΡΠ½ΡΠΉ ΠΊΠΎΠ΄
char findreg (char reg[8]); // ΠΏΠΎΠΈΡΠΊ ΠΎΠ±ΠΎΠ·Π½Π°Ρ. ΡΠ΅Π³ΠΈΡΡΡΠ° Π² REGTAB
char findsegr (char reg[8]); // ΠΏΠΎΠΈΡΠΊ ΠΎΠ±ΠΎΠ·Π½Π°Ρ. ΡΠ΅Π³. ΡΠ΅Π³ΠΈΡΡΡΠ° Π² SEGRTAB
char findsym (char sym[8]); // ΠΏΠΎΠΈΡΠΊ ΠΌΠ΅ΡΠΊΠΈ Π² SYMTAB
int str2num (char str[8]); // ΠΏΠ΅ΡΠ΅Π²ΠΎΠ΄ ΡΡΡΠΎΠΊΠΈ Π² ΡΠΎΠΎΡΠ². ΡΠΈΡΠ»ΠΎ
char findch (char c); // ΠΏΠΎΠΈΡΠΊ ΠΏΠΎΠΈΡΠΊ ΡΠΈΠΌΠ²ΠΎΠ»Π° Π² HEXTAB
int step (int a, int b); // Π²ΠΎΠ·Π²Π΅Π΄Π΅Π½ΠΈΠ΅ A Π² ΡΡΠ΅ΠΏΠ΅Π½Ρ B
int main ()
{
char cod[4], lent, // ΠΊΠΎΠ΄ ΠΈ Π΄Π»ΠΈΠ½Π½Π° ΠΊΠΎΠΌΠ°Π½Π΄Ρ
num; // Π½ΠΎΠΌΠ΅Ρ ΠΎΠ±ΡΠ°Π±ΠΎΡΡΠΈΠΊΠ° ΠΊΠΎΠΌΠ°Π½Π΄Ρ
FILE * ft; // ΠΈΡΡ ΠΎΠ΄Π½ΡΠΉ Π°ΡΡΠ΅ΠΌΠ±Π»Π΅ΡΠ½ΡΠΉ ΡΠ°ΠΉΠ»
char fn[]={"myprim.asm"};
ft=fopen (fn, «r+»);
clrscr ();
////////////////////////////first passage\\\\\\\\\\\\\\\
printf («*** first passage *** n»);
seg=0;
npr=0;
psym=0;
while (! feof (ft)) // ΠΏΠΎΠ²ΡΠΎΡΡΡΡ ΠΏΠΎΠΊΠ° Π½Π΅ ΠΊΠΎΠ½Π΅Ρ ΡΠ°ΠΉΠ»Π°
{fgets (stk, 80, ft); // ΡΡΠ΅Π½ΠΈΠ΅ ΡΡΡΠΎΠΊΠΈ
printf («n»);
getch ();
puts (stk);
stk2pol (stk, pole); // ΡΠ°Π·Π±ΠΈΠ΅Π½ΠΈΠ΅ ΡΡΡΠΎΠΊΠΈ Π½Π° ΠΏΠΎΠ»Ρ
if (! strcmp (pole[1], «segment»)) //if Π²ΡΠΎΡΠΎΠ΅ ΠΏΠΎΠ»Π΅ SEGMENT
{seg++; // ΡΠ²Π΅Π»ΠΈΡΠ΅Π½ΠΈΠ΅ Π½ΠΎΠΌΠ΅ΡΠ° ΡΠ΅Π³ΠΌΠ΅Π½ΡΠ°, Π·Π°ΠΏΠΈΡΡ
cnt=0; // Π½Π°Π·Π²Π°Π½ΠΈΡ Π² SEGTAB, ΡΠ±ΡΠΎΡ ΡΡΠ΅ΡΡΠΈΠΊΠ°
strcpy (segtab [seg-1]. name, pole[0]); // ΡΠ°Π·ΠΌΠ΅ΡΠ΅Π½ΠΈΡ
continue;
}
if (! strcmp (pole[1], «ends»)) //if ENDS, ΡΠΎ Π·Π°ΠΏΠΈΡΡ Π΄Π»ΠΈΠ½Π½Ρ ΡΠ΅Π³ΠΌ-ΡΠ°
{segtab [seg-1]. len=cnt;
printf («add to segtab:%s % d % dn»,
segtab [seg-1]. name, seg, segtab [seg-1]. len);
continue;
}
if ((! strcmp (pole[0], «assume»))||(! strcmp (pole[0], ««)))
continue; //if ΠΏΡΡΡΠΎΠ΅ ΠΏΠΎΠ»Π΅-ΡΡΠ΅Π½ΠΈΠ΅ ΡΠ». ΡΡΡΠΎΠΊΠΈ
num=findop (pole[0]);
if (num) //if ΠΊΠΎΠ΄ ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠΈ — ΡΠ²Π΅Π»ΠΈΡΠ΅Π½ΠΈΠ΅
{lent=op2code (num, 0, pole, cod); // ΡΡΠ΅Ρ. ΡΠ°Π·ΠΌΠ΅Ρ. Π½Π° Π΅Π΅ Π΄Π»ΠΈΠ½Π½Ρ
if (lent) {printf («lenght:%dn», lent);
cnt+=lent;
}
else printf («Error: wrong operand! n»);
continue;
}
if ((pole[0] [strlen (pole[0]) — 1]==':')||(! strcmp (pole[1], «dw»)))
{if (pole[0] [strlen (pole[0]) — 1]==':')
pole[0] [strlen (pole[0]) — 1]=''; //if ΠΌΠ΅ΡΠΊΠ°
if (findsym (pole[0])==-1) // Π½Π΅ Π½Π°ΠΉΠ΄Π΅Π½Π° Π² SYMTAB
{strcpy (symtab[psym]. name, pole[0]); // Π·Π°Π½Π΅ΡΠ΅Π½ΠΈΠ΅ Π² SYMTAB
symtab[psym]. sgm=seg;
symtab[psym].dsp=cnt;
printf («add to symtab:%s % d % dn»,
symtab[psym]. name, symtab[psym]. sgm, symtab[psym]. dsp);
psym++;
} //if ΠΌΠ΅ΡΠΊΠ° Π½Π°ΠΉΠ΄Π΅Π½Π° — ΠΎΡΠΈΠ±ΠΊΠ°
else printf («Error: label % s retry! n», pole[0]);
if (! strcmp (pole[1], ««)) continue;
num=findop (pole[1]);
if (num) //if ΠΊΠΎΠ΄ ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠΈ — ΡΠ²Π΅Π»ΠΈΡΠ΅Π½ΠΈΠ΅
{lent=op2code (num, 1, pole, cod); // ΡΡΠ΅Ρ. ΡΠ°Π·ΠΌΠ΅Ρ. Π½Π° Π΅Π΅ Π΄Π»ΠΈΠ½Π½Ρ
if (lent) {printf («lenght:%dn», lent);
cnt+=lent;
}
else printf («Error: wrong operand! n»);
}
else printf («Error: wrong mnemonic code! n»);
} // Π²ΠΎ Π²ΡΠ΅Ρ Π΄Ρ. ΡΠ»ΡΡΠ°ΡΡ — ΠΎΡΠΈΠ±ΠΊΠ°
}
////////////////////////////second passage\\\\\\\\\\\\\\
FILE * ftmp; // Π²ΡΠ΅ΠΌΠ΅Π½Π½ΡΠ΅ ΡΠ°ΠΉΠ»Ρ
char fname[2] [10]={{"temp1.dat"}, {"temp2.dat"}};
getch ();
clrscr ();
printf («*** second passage *** n»);
pmdf=0;
npr++;
seg=0;
rewind (ft);
while (! feof (ft)) // ΠΏΠΎΠ²ΡΠΎΡΡΡΡ ΠΏΠΎΠΊΠ° Π½Π΅ ΠΊΠΎΠ½Π΅Ρ ΡΠ°ΠΉΠ»Π°
{fgets (stk, 80, ft); // ΡΡΠ΅Π½ΠΈΠ΅ ΡΡΡΠΎΠΊΠΈ
printf («n»);
getch ();
puts (stk);
stk2pol (stk, pole); // ΡΠ°Π·Π±ΠΈΠ΅Π½ΠΈΠ΅ ΡΡΡΠΎΠΊΠΈ Π½Π° ΠΏΠΎΠ»Ρ
if (! strcmp (pole[1], «segment»)) //if Π²ΡΠΎΡΠΎΠ΅ ΠΏΠΎΠ»Π΅ SEGMENT
{seg++; // ΡΠ²Π΅Π»ΠΈΡΠ΅Π½ΠΈΠ΅ Π½ΠΎΠΌΠ΅ΡΠ° ΡΠ΅Π³ΠΌΠ΅Π½ΡΠ°
ftmp=fopen (fname [seg-1], «w+b»); // ΠΎΡΠΊΡΡΡΡ ΡΠΎΠΎΡΠ². Π²Ρ. ΡΠ°ΠΉΠ»
cnt=0; // ΡΠ±ΡΠΎΡ ΡΡΠ΅ΡΡΠΈΠΊΠ° ΡΠ°Π·ΠΌΠ΅ΡΠ΅Π½ΠΈΡ
continue;
}
if (! strcmp (pole[1], «ends»)) //if ENDS-Π·Π°ΡΠΊΡΡΡΡ ΡΠΎΠΎΡΠ². Π²Ρ. ΡΠ°ΠΉΠ»
{fclose (ftmp);
continue;
}
if ((! strcmp (pole[0], «assume»))||(! strcmp (pole[0], ««)))
continue; //if ΠΏΡΡΡΠΎΠ΅ ΠΏΠΎΠ»Π΅-ΡΡΠ΅Π½ΠΈΠ΅ ΡΠ». ΡΡΡΠΎΠΊΠΈ
num=findop (pole[0]);
if (num) //if ΠΌΠ½Π΅ΠΌΠΎΠΊΠΎΠ΄ ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠΈ — Π·Π°ΠΏΠΈΡΡ
{lent=op2code (num, 0, pole, cod); // ΠΎΠ±ΡΠ΅ΠΊΡΠ½. ΠΊΠΎΠ΄Π° Π²ΠΎ Π²Ρ. ΡΠ°ΠΉΠ»
if (lent) {printf («code:»);
for (i=0; i
{printf («%x», cod[i]);
putc (cod[i], ftmp);
}
cnt+=lent;
printf («n»);
}
else printf («Error: wrong operand! n»);
continue;
}
num=findop (pole[1]);
if (num) //if ΠΌΠ½Π΅ΠΌΠΎΠΊΠΎΠ΄ ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠΈ — Π·Π°ΠΏΠΈΡΡ
{lent=op2code (num, 1, pole, cod); // ΠΎΠ±ΡΠ΅ΠΊΡΠ½. ΠΊΠΎΠ΄Π° Π²ΠΎ Π²Ρ. ΡΠ°ΠΉΠ»
if (lent) {printf («code:»);
for (i=0; i
{printf («%x», cod[i]);
putc (cod[i], ftmp);
}
cnt+=lent;
printf («n»);
}
else printf («Error: wrong operand! n»);
} // Π²ΠΎ Π²ΡΠ΅Ρ Π΄Ρ. ΡΠ»ΡΡΠ°ΡΡ — ΠΎΡΠΈΠ±ΠΊΠ°
}
/////////////////////creation object file\\\\\\\\\\\\\
FILE * fobj; // ΡΠΎΠ·Π΄Π°Π½ΠΈΠ΅ ΠΎΠ±ΡΠ΅ΠΊΡΠ½. ΡΠ°ΠΉΠ»Π°
char fnobj[]={"myprim.obj"};
fobj=fopen (fnobj, «w+b»);
fprintf (fobj, «%c % c % c % c % s % c», 0×80,0xc, 0×0,0xa, «myprim.asm», 0x5d);
// Π½Π°Π·Π²Π°Π½ΠΈΠ΅ ΠΈΡΡ ΠΎΠ΄Π½ΠΎΠ³ΠΎ Π°ΡΡΠ΅ΠΌΠ±Π»Π΅ΡΠ½ΠΎΠ³ΠΎ ΡΠ°ΠΉΠ»Π°
fprintf (fobj, «%c % c % c % c % c % c % s % c», 0×88,0×20,0×0,0×0,0×0,0x1c,
«Turbo Assembler Version 3.2», 0×99); // Π²Π΅ΡΡΠΈΡ Π°ΡΡΠ΅ΠΌΠ±Π»Π΅ΡΠ°
fprintf (fobj, «%c % c % c % c % c % c % c % c % c % c % s % c», 0×88,0×12,0×0,0×40,0xe9,
0xb5,0x6e, 0xb0,0×30,0xa, «myprim.asm», 0×23);
// Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡΠ΅Π»ΡΠ½Π°Ρ Π·Π°ΠΏΠΈΡΡ Ρ Π½Π°Π·Π²Π°Π½ΠΈΠ΅ΠΌ ΠΈΡΡ ΠΎΠ΄Π½ΠΎΠ³ΠΎ Π°ΡΡΠ΅ΠΌΠ±Π»Π΅ΡΠ½ΠΎΠ³ΠΎ ΡΠ°ΠΉΠ»Π°
fprintf (fobj, «%c % c % c % c % c % c % c % c % c % c % c % c % c % c % c % c % c», 0×88,0×3,
0x0,0×40,0xe9,0x4c, 0×96,0×2,0×0,0×0,0×68,0×88,0×3,0×0,0×40,
0xa1,0×94); // ΡΡΠΈ ΠΏΠΎΡΡΠΎΡΠ½Π½ΡΡ Π·Π°ΠΏΠΈΡΠΈ
for (char y=0; y<=1; y++) // ΠΠ²Π΅ Π·Π°ΠΏΠΈΡΠΈ ΠΎΠΏΠΈΡΠ°Π½ΠΈΡ ΡΠ΅Π³ΠΌΠ΅Π½ΡΠΎΠ²
{
c=0;
i=0×96; c+=i; putc (i, fobj);
i=strlen (segtab[y]. name)+2; c+=i; putc (i, fobj);
i=0; c+=i; putc (i, fobj);
i=strlen (segtab[y]. name); c+=i; putc (i, fobj);
for (char x=0; x
{i=toupper (segtab[y]. name[x]); c+=i;
putc (i, fobj);
}
i=0-c; putc (i, fobj);
c=0;
i=0×98; c+=i; putc (i, fobj);
i=0×7; c+=i; putc (i, fobj);
i=0×0; c+=i; putc (i, fobj);
i=0×60; c+=i; putc (i, fobj);
i=segtab[y]. len; c+=i; putc (i, fobj);
i=0×0; c+=i; putc (i, fobj);
i=y+2; c+=i; putc (i, fobj);
i=0×1; c+=i; putc (i, fobj);
i=0×1; c+=i; putc (i, fobj);
i=0-c; putc (i, fobj);
}
fprintf (fobj, «%c % c % c % c % c % c % c», 0×88,0×4,0×0,0×40,0xa2,0×1,0×91);
// Π·Π°ΠΏΠΈΡΡ Π½Π°ΡΠ°Π»Π° ΡΠ΅Π³ΠΌΠ΅Π½ΡΠΎΠ² (ΠΏΡΠ΅Π΄ΡΠ΅Π³ΠΌΠ΅Π½ΡΠ½Π°Ρ Π·Π°ΠΏΠΈΡΡ)
for (y=0; y<=1; y++) // Π·Π°ΠΏΠΈΡΡ — ΡΠ΅Π»ΠΎ ΡΠ΅Π³ΠΌΠ΅Π½ΡΠΎΠ²
{
c=0;
i=0xa0; c+=i; putc (i, fobj);
i=segtab[y]. len+4; c+=i; putc (i, fobj);
i=0; c+=i; putc (i, fobj);
i=y+1; c+=i; putc (i, fobj);
i=0; c+=i; putc (i, fobj);
i=0; c+=i; putc (i, fobj);
ftmp=fopen (fname[y], «rb»);
for (char x=0; x
{i=getc (ftmp); c+=i;
putc (i, fobj);
}
fclose (ftmp);
i=0-c; putc (i, fobj);
}
modif[pmdf]=''; // Π·Π°ΠΏΠΈΡΡ — ΡΠ°Π±Π»ΠΈΡΠ° ΡΡΡΠ»ΠΎΠΊ (ΠΌΠΎΠ΄ΠΈΡΠΈΠΊΠ°ΡΠΎΡΠΎΠ²)
c=0;
i=0x9c; c+=i; putc (i, fobj);
i=2*strlen (modif)+1; c+=i; putc (i, fobj);
i=0; c+=i; putc (i, fobj);
i=0xc8; c+=i; putc (i, fobj);
i=modif[0]; c+=i; putc (i, fobj);
i=0×54; c+=i; putc (i, fobj);
i=modif[1]; c+=i; putc (i, fobj);
for (y=2; y
{i=0xc4; c+=i; putc (i, fobj);
i=modif[y]; c+=i; putc (i, fobj);
i=0×54; c+=i; putc (i, fobj);
i=modif [y+1]; c+=i; putc (i, fobj);
}
i=0-c; putc (i, fobj);
fprintf (fobj, «%c % c % c % c % c % c % c % c % c % c», 0x8a, 0×7,0×0,
0xc1,0×0,0×2,0×2,0×0,0×0,0xaa);
// Π·Π°ΠΏΠΈΡΡ — ΠΊΠΎΠ½Π΅Ρ ΠΎΠ±ΡΠ΅ΠΊΡΠ½ΠΎΠ³ΠΎ ΡΠ°ΠΉΠ»Π°
/////////////////////system information\\\\\\\\\\\\\
getch ();
clrscr ();
printf («SYMTABn»); // Π²ΡΠ²ΠΎΠ΄ Π½Π° ΡΠΊΡΠ°Π½ ΡΠ°Π±Π»ΠΈΡ:
printf («name disp seg n»); //SYMTAB, SEGTAB ΠΈ ΡΠ°Π±Π». ΡΡΡΠ»ΠΎΠΊ
for (i=0; i
printf («%s %d %d n»,
symtab[i]. name, symtab[i]. dsp, symtab[i]. sgm);
printf («n»);
printf («SEGTABn»);
printf («name N lent n»);
for (i=0; i<2; i++)
printf («%s %d %d n»,
segtab[i]. name, i, segtab[i]. len);
printf («n»);
//printf («modifikatory n»);
//for (i=0; i
printf («n»);
fclose (ft);
fclose (fobj);
getch ();
return (0); // Π²ΡΡ ΠΎΠ΄ ΠΈΠ· ΡΡΠ°Π½ΡΠ»ΡΡΠΎΡΠ°.
}
void stk2pol (char st[80], char pol[4] [8]) // ΡΠ°Π·Π±ΠΈΠ΅Π½ΠΈΠ΅ ΡΡΡΠΎΠΊΠΈ Π½Π° ΠΏΠΎΠ»Ρ
{
char fl=0, k=0, j=0; // Π²Π½ΡΡΡ. ΠΏΠ΅ΡΠ΅ΠΌ.-ΡΡΠ΅ΡΡΠΈΠΊΠΈ ΠΈ ΡΠ»Π°Π³ΠΈ
i=0;
while ((st[i]≠'')&&(st[i]≠'n')) // ΠΏΠΎΠ²ΡΠΎΡΡΡΡ ΠΏΠΎΠΊΠ° Π½Π΅ ΠΊΠΎΠ½Π΅Ρ ΡΡΡΠΎΠΊΠΈ
{if ((st[i]==' ')||(st[i]==', ')||(st[i]==' ')||(j==8))
{if (fl) //if ΡΠ°Π·Π΄Π΅Π»ΠΈΡΠ΅Π»Ρ — ΠΏΠ΅ΡΠ΅Ρ ΠΎΠ΄ Π½Π°
{pol[k] [j]=''; // Π·Π°ΠΏΠΎΠ»Π½. ΡΠ»Π΅Π΄ΡΡΡΠ΅Π³ΠΎ ΠΏΠΎΠ»Ρ
j=0;
k++;
if (k==4) return; //max ΠΊΠΎΠ»-Π²ΠΎ ΠΏΠΎΠ»Π΅ΠΉ = 4
fl=0;
}
}
else if (st[i]==';') {for (; k<=3; k++) pol[k] [0]='';
return; //if ΠΊΠΎΠΌΠΌΠ΅Π½ΡΠ°ΡΠΈΠΉ — ΠΏΠΎΠ»Ρ Π½ΡΠ»Π΅Π²ΡΠ΅
}
else {fl=1; // Π·Π°ΠΏΠΈΡΡ ΡΠΈΠΌΠ²ΠΎΠ»Π° Π² ΡΠ΅ΠΊΡΡΠ΅Π΅ ΠΏΠΎΠ»Π΅
pol[k] [j]=st[i];
j++;
}
i++;
}
pol[k] [j]='';
k++;
for (; k<=3; k++) pol[k] [0]='';
return; // ΠΊΠΎΠ½Π΅Ρ stk2pol
}
char findop (char op[8]) // ΠΏΠΎΠΈΡΠΊ ΠΌΠ½Π΅ΠΌΠΎΠΊΠΎΠ΄Π° Π² OPTAB
{for (i=0; i<=7; i++) if (! strcmp (optab[i], op)) return (i+1);
return (0);}
char findsym (char sym[8]) // ΠΏΠΎΠΈΡΠΊ ΠΌΠ΅ΡΠΊΠΈ Π² SYMTAB
{for (i=0; i<=psym; i++) if (! strcmp (symtab[i]. name, sym)) return (i);
return (-1);
}
char findreg (char reg[8]) // ΠΏΠΎΠΈΡΠΊ ΠΎΠ±ΠΎΠ·Π½Π°Ρ. ΡΠ΅Π³ΠΈΡΡΡΠ° Π² REGTAB
{for (i=0; i<=7; i++) if (! strcmp (regtab[i], reg)) return (i);
return (-1);
}
char findsegr (char reg[8]) // ΠΏΠΎΠΈΡΠΊ ΠΎΠ±ΠΎΠ·Π½Π°Ρ. ΡΠ΅Π³. ΡΠ΅Π³ΠΈΡΡΡΠ° Π² SEGRTAB
{for (i=0; i<=3; i++) if (! strcmp (segrtab[i], reg)) return (i);
return (-1);
}
char op2code (char nmb, char dis, char pol[4] [8], char code[4])
// Ρ-ΡΠΈΡ ΠΎΠ±ΡΠ°Π±ΠΎΡΠΊΠΈ ΠΊΠΎΠΌΠ°Π½Π΄ Π°ΡΡΠ΅ΠΌΠ±Π»Π΅ΡΠ° ΠΈ Π΄ΠΈΡΠ΅ΠΊΡΠΈΠ²
{struct bits // ΡΡΡΡΠΊΡΡΡΠ° Π΄Π»Ρ Π΄ΠΎΡΡΡΠΏΠ° ΠΊ
{char b0:1; char b1:1; char b2:1; char b3:1; // ΠΊ ΠΎΡΠ΄Π΅Π»ΡΠ½ΡΠΌ Π±ΠΈΡΠ°ΠΌ.
char b4:1; char b5:1; char b6:1; char b7:1;
};
union bytes
{char c;
bits b;
} temp, bcode;
union int2ch
{char c[2];
int d;
} tmp2;
char regn, regn2, segrn, tmp3; //regn, regn2, segrn-Π½ΠΎΠΌΠ΅ΡΠ° ΡΠ΅Π³ΠΈΡΡΡΠΎΠ²
dis++;
switch (nmb) // ΠΏΠ΅ΡΠ΅Ρ ΠΎΠ΄ Π½Π° ΠΎΠ±ΡΠ°Π±ΠΎΡΡΠΈΠΊ ΡΠΎΠΎΡΠ². ΠΊΠΎΠΌΠ°Π½Π΄Ρ
// MOV
{case 1: regn=findreg (pol[dis]);
regn2=findreg (pol[dis+1]);
segrn=findsegr (pol[dis]);
// Π½Π΅ΠΏΠΎΡΡΠ΅Π΄ΡΡΠ²Π΅Π½Π½Π°Ρ Π°Π΄ΡΠ΅ΡΠ°ΡΠΈΡ
if ((! regn)&&(! strcmp (segtab[0]. name, pol [dis+1])))
{code[0]=0xb8; code[1]=0; code[2]=0; // ΠΊΠΎΠ΄ ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠΈ
if (npr) {modif[pmdf]=(cnt+3) — 2;
pmdf++;
modif[pmdf]=1;
pmdf++;
}
return (3); // ΠΎΠ±ΡΠ°Π±. Π²ΠΎΠ·Π²ΡΠ°Ρ. Π΄Π»ΠΈΠ½Π½Ρ ΠΊΠΎΠΌΠ°Π½Π΄Ρ
}
// ΡΠ΅Π³ΠΈΡΡΡ Π² ΡΠ΅Π³ΠΌΠ΅Π½ΡΠ½ΡΠΉ ΡΠ΅Π³ΠΈΡΡΡ
if ((segrn≠-1)&&(regn2≠-1))
{code[0]=0x8e; // ΠΊΠΎΠ΄ ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠΈ
bcode.c=0xc0;
temp.c=segrn;
bcode.b.b3=temp.b.b0; // Π½ΠΎΠΌΠ΅Ρ ΡΠ΅Π³ΠΌΠ΅Π½ΡΠ½ΠΎΠ³ΠΎ ΡΠ΅Π³ΠΈΡΡΡΠ°
bcode.b.b4=temp.b.b1;
temp.c=regn2;
bcode.b.b0=temp.b.b0; // Π½ΠΎΠΌΠ΅Ρ ΡΠ΅Π³ΠΈΡΡΡΠ°
bcode.b.b1=temp.b.b1;
bcode.b.b2=temp.b.b2;
code[1]=bcode.c;
return (2); // ΠΎΠ±ΡΠ°Π±. Π²ΠΎΠ·Π²ΡΠ°Ρ. Π΄Π»ΠΈΠ½Π½Ρ ΠΊΠΎΠΌΠ°Π½Π΄Ρ
}
if ((regn≠-1)||(regn2≠-1))
// ΠΠ°ΠΌΡΡΡ Π²/ΠΈΠ· ΡΠ΅Π³ΠΈΡΡΡ AX (AL)
{if ((! regn)||(! regn2))
{bcode.c=0xa1; // ΠΊΠΎΠ΄ ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠΈ
if (regn) {bcode.b.b1=1; regn=regn2;}
else dis++;
code[0]=bcode.c;
if (npr)
{tmp3=findsym (pole[dis]);
if (tmp3==-1) return (0);
else {tmp2.d=symtab[tmp3]. dsp;
code[1]=tmp2.c[0];
code[2]=tmp2.c[1];
}
modif[pmdf]=(cnt+3) — 2;
pmdf++;
modif[pmdf]=symtab[tmp3]. sgm;
pmdf++;
}
else {code[1]=0; code[2]=0;}
return (3); // ΠΎΠ±ΡΠ°Π±. Π²ΠΎΠ·Π²ΡΠ°Ρ. Π΄Π»ΠΈΠ½Π½Ρ ΠΊΠΎΠΌΠ°Π½Π΄Ρ
}
// Π Π΅Π³ΠΈΡΡΡ/ΠΏΠ°ΠΌΡΡΡ Π²/ΠΈΠ· ΡΠ΅Π³ΠΈΡΡΡ
else
{bcode.c=0x8b; // ΠΊΠΎΠ΄ ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠΈ
if (regn==-1) {bcode.b.b1=0; regn=regn2;}
else dis++;
code[0]=bcode.c;
bcode.c=0×06;
temp.c=regn;
bcode.b.b3=temp.b.b0; // Π½ΠΎΠΌΠ΅Ρ ΡΠ΅Π³ΠΈΡΡΡΠ° -> ΠΊΠΎΠ΄ ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠΈ
bcode.b.b4=temp.b.b1;
bcode.b.b5=temp.b.b2;
code[1]=bcode.c;
if (npr)
{tmp3=findsym (pole[dis]);
if (tmp3==-1) return (0);
else {tmp2.d=symtab[tmp3]. dsp;
code[2]=tmp2.c[0];
code[3]=tmp2.c[1];
}
modif[pmdf]=(cnt+4) — 2;
pmdf++;
modif[pmdf]=symtab[tmp3]. sgm;
pmdf++;
}
else {code[2]=0; code[3]=0;}
return (4); // ΠΎΠ±ΡΠ°Π±. Π²ΠΎΠ·Π²ΡΠ°Ρ. Π΄Π»ΠΈΠ½Π½Ρ ΠΊΠΎΠΌΠ°Π½Π΄Ρ
}
}
break;
//NEG
case 2: regn=findreg (pol[dis]);
if (regn≠-1)
{code[0]=0xf7; // ΠΊΠΎΠ΄ ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠΈ
bcode.c=0xd8;
temp.c=regn;
bcode.b.b0=temp.b.b0; // Π½ΠΎΠΌΠ΅Ρ ΡΠ΅Π³ΠΈΡΡΡΠ° -> ΠΊΠΎΠ΄ ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠΈ
bcode.b.b1=temp.b.b1;
bcode.b.b2=temp.b.b2;
code[1]=bcode.c;
return (2);
}
break;
//JE
case 3: if (npr)
{tmp3=findsym (pole[dis]);
if (tmp3==-1) return (0);
else code[1]=symtab[tmp3]. dsp — (cnt+2); // ΠΎΠΏΡΠ΅Π΄Π΅Π». ΡΠΌΠ΅ΡΠ΅Π½ΠΈΡ
}
else code[1]=0;
code[0]=0×74; // ΠΊΠΎΠ΄ ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠΈ
return (2);
break;
//INC
case 4: regn=findreg (pol[dis]);
if (regn≠-1)
{bcode.c=0×40; // ΠΊΠΎΠ΄ ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠΈ
temp.c=regn;
bcode.b.b0=temp.b.b0; // Π½ΠΎΠΌΠ΅Ρ ΡΠ΅Π³ΠΈΡΡΡΠ° -> ΠΊΠΎΠ΄ ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠΈ
bcode.b.b1=temp.b.b1;
bcode.b.b2=temp.b.b2;
code[0]=bcode.c;
return (1); // ΠΎΠ±ΡΠ°Π±. Π²ΠΎΠ·Π²ΡΠ°Ρ. Π΄Π»ΠΈΠ½Π½Ρ ΠΊΠΎΠΌΠ°Π½Π΄Ρ
}
break;
//SHL
case 5: regn=findreg (pol[dis]);
if ((regn≠-1)&&(! strcmp (pol[dis+1], «1»)))
{code[0]=0xd1; // ΠΊΠΎΠ΄ ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠΈ
bcode.c=0xe0;
temp.c=regn;
bcode.b.b0=temp.b.b0; // Π½ΠΎΠΌΠ΅Ρ ΡΠ΅Π³ΠΈΡΡΡΠ° -> ΠΊΠΎΠ΄ ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠΈ
bcode.b.b1=temp.b.b1;
bcode.b.b2=temp.b.b2;
code[1]=bcode.c;
return (2); // ΠΎΠ±ΡΠ°Π±. Π²ΠΎΠ·Π²ΡΠ°Ρ. Π΄Π»ΠΈΠ½Π½Ρ ΠΊΠΎΠΌΠ°Π½Π΄Ρ
}
break;
//ADC
case 6: regn=findreg (pol[dis]);
if (regn≠-1)
{code[0]=0×13; // ΠΊΠΎΠ΄ ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠΈ
bcode.c=0xc0;
temp.c=regn;
bcode.b.b3=temp.b.b0; // Π½ΠΎΠΌΠ΅Ρ ΡΠ΅Π³ΠΈΡΡΡΠ° -> ΠΊΠΎΠ΄ ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠΈ
bcode.b.b4=temp.b.b1;
bcode.b.b5=temp.b.b2;
regn=findreg (pol[dis+1]);
if (regn≠-1)
{temp.c=regn;
bcode.b.b0=temp.b.b0; // Π½ΠΎΠΌΠ΅Ρ ΡΠ΅Π³ΠΈΡΡΡΠ° -> ΠΊΠΎΠ΄ ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠΈ
bcode.b.b1=temp.b.b1;
bcode.b.b2=temp.b.b2;
code[1]=bcode.c;
return (2); // ΠΎΠ±ΡΠ°Π±. Π²ΠΎΠ·Π²ΡΠ°Ρ. Π΄Π»ΠΈΠ½Π½Ρ ΠΊΠΎΠΌΠ°Π½Π΄Ρ
}
}
break;
//INT
case 7: code[0]=0xcd; // ΠΊΠΎΠ΄ ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠΈ
code[1]=str2num (pol[dis]);
if (code[1]≠-1) return (2);
break;
//DW
case 8: tmp2. d=str2num (pol[dis]);
code[0]=tmp2.c[0];
code[1]=tmp2.c[1];
if (tmp2.d≠-1) return (2);
break;
}
return (0); //if ΠΎΡΠΈΠ±ΠΊΠ° — Π΄Π»ΠΈΠ½Π½Π° Π½ΠΎΠ»Ρ
}
int str2num (char str[8]) // ΠΏΠ΅ΡΠ΅Π²ΠΎΠ΄ ΡΡΡΠΎΠΊΠΈ Π² ΡΠΎΠΎΡΠ². ΡΠΈΡΠ»ΠΎ
{int zn, j;
zn=0;
j=0;
if (str [strlen (str) — 1]=='h') // ΡΠ΅ΡΡΠ½Π°Π΄ΡΠ°ΡΠ΅ΡΠΈΡΠ½ΠΎΠ΅ ΡΠΈΡΠ»ΠΎ
for (char k=strlen (str) — 2; k>=0; k-)
{if (findch (str[k])==-1) return (-1); // Π½Π΅ ΠΏΡΠ°Π²ΠΈΠ»ΡΠ½ΡΠΉ ΡΠΎΡΠΌΠ°Ρ — ΠΎΡΠΈΠ±ΠΊΠ°
zn=zn+(findch (str[k]))*step (16, j);
j++;
}
else // Π΄Π΅ΡΡΡΠΈΡΠ½ΠΎΠ΅ ΡΠΈΡΠ»ΠΎ
{for (char k=strlen (str) — 1; k>=0; k-)
{if (findch (str[k])==-1) return (-1);
zn=zn+(findch (str[k]))*step (10, j);
j++;
}
}
return (zn);
}
char findch (char c) // ΠΏΠΎΠΈΡΠΊ ΡΠΈΠΌΠ²ΠΎΠ»Π° Π² HEXTAB
{for (i=0; i<=15; i++) if (hextab[i]==c) return (i);
return (-1);
}
int step (int a, int b) // Π²ΠΎΠ·Π²Π΅Π΄Π΅Π½ΠΈΠ΅ A Π² ΡΡΠ΅ΠΏΠ΅Π½Ρ B
{int z=1;
for (i=0; i
1. ΠΠ±Π΅Π»Ρ Π. ΠΡΡΠ΅ΠΌΠ±Π»Π΅Ρ ΠΈ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠΈΡΠΎΠ²Π°Π½ΠΈΠ΅ Π΄Π»Ρ IBM PC. Π’Π΅Ρ Π½ΠΎΠ»ΠΎΠ³ΠΈΡΠ΅ΡΠΊΠΈΠΉ ΠΈΠ½ΡΡΠΈΡΡΡ ΠΡΠΈΡΠ°Π½ΡΠΊΠ°Ρ ΠΠΎΠ»ΡΠΌΠ±ΠΈΡ.
2. ΠΡΡΠ΄Π΅Π½ Π . Π‘ΠΏΡΠ°Π²ΠΎΡΠ½ΠΈΠΊ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠΈΡΡΠ° Π½Π° ΠΏΠ΅ΡΡΠΎΠ½Π°Π»ΡΠ½ΠΎΠΌ ΠΊΠΎΠΌΠΏΡΡΡΠ΅ΡΠ΅ ΡΠΈΡΠΌΡ IBM.
3. ΠΡΠ±ΠΊΠΎΠ² Π‘. Π. Assembler Π΄Π»Ρ DOS, Windows ΠΈ Unix. — Π.: ΠΠΠ ΠΡΠ΅ΡΡ, 2000. — 608 Ρ.: ΠΈΠ». (Π‘Π΅ΡΠΈΡ Π΄Π»Ρ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠΈΡΡΠΎΠ²).