ΠŸΠΎΠΌΠΎΡ‰ΡŒ Π² написании студСнчСских Ρ€Π°Π±ΠΎΡ‚
АнтистрСссовый сСрвис

ΠŸΡ€ΠΎΠ΅ΠΊΡ‚ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ компилятора

ΠšΠΎΠ½Ρ‚Ρ€ΠΎΠ»ΡŒΠ½Π°ΡΠŸΠΎΠΌΠΎΡ‰ΡŒ Π² Π½Π°ΠΏΠΈΡΠ°Π½ΠΈΠΈΠ£Π·Π½Π°Ρ‚ΡŒ ΡΡ‚ΠΎΠΈΠΌΠΎΡΡ‚ΡŒΠΌΠΎΠ΅ΠΉ Ρ€Π°Π±ΠΎΡ‚Ρ‹

ΠžΠΏΠ΅Ρ€Π°Ρ†ΠΈΡ: ΠŸΡ€Π΅Ρ€Ρ‹Π²Π°Π΅Ρ‚ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ ΠΈ ΠΏΠ΅Ρ€Π΅Π΄Π°Π΅Ρ‚ ΡƒΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΠ΅ ΠΏΠΎ ΠΎΠ΄Π½ΠΎΠΌΡƒ ΠΈΠ· 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 с.: ΠΈΠ». (БСрия для программистов).

ΠŸΠΎΠΊΠ°Π·Π°Ρ‚ΡŒ вСсь тСкст
Π—Π°ΠΏΠΎΠ»Π½ΠΈΡ‚ΡŒ Ρ„ΠΎΡ€ΠΌΡƒ Ρ‚Π΅ΠΊΡƒΡ‰Π΅ΠΉ Ρ€Π°Π±ΠΎΡ‚ΠΎΠΉ