Разработка компилятора ассемблера для процессора i80386

Написание компилятора ассемблера сводиться к выполнению следующих шагов:

  1. Написание парсера языка
  2. Перевод по таблицам мнемокода в машинный код (то есть компиляция)
  3. Подключение библиотечных (*.LIB) и объектных (*.OBJ) файлов
  4. Сохранение полученных кодов в формате EXE-файла

Парсер языка - дело не такое уж и сложное. Сделаем для этого класс CParser.

Другое дело процесс компиляции. Для этого компилятор по данным парсера должен перелопатить кучу таблиц перевода мнемокодов в машинные коды. Таблицы приведены ниже.

1. Операции над целыми числами

Команды пересылки данных
Мнемокод Операнд Код
MOVr/m, reg100010dw | modregr/m
MOVr/m, imm1100011w | mod000r/m | data
MOVreg, imm1011wreg | data
MOVacc, mem101000dw | addr
MOVr/m, seg100011d0 | modsegr/m
MOVreg32, sys00001111 | 00100tdg | 11sysreg
XCHGr/m, reg1000011w | modregr/m
XCHGacc, reg16/3210010reg
PUSHr/m16/3211111111 | mod110r/m
PUSHreg16/3201010reg
PUSHseg (только cs, ds, ss, es)00seg110
PUSHseg00001111 | 10seg000
PUSHimm011010s0 | data
POPr/m16/3210001111 | mod110r/m
POPreg16/3201011reg
POPseg (только cs, ds, ss, es)00seg111
POPseg00001111 | 10seg001
PUSHA-01100000
PUSHAD-01100000
POPA-01100001
POPAD-01100001
INacc, imm81110010w | data
INacc, DX1110110w
OUTacc, imm81110011w | data
OUTacc, DX1110011w
MOVSXreg16/32, r/m800001111 | 1011111w | modregr/m
MOVSXreg32, r/m1600001111 | 1011111w | modregr/m
MOVZXreg16/32, r/m800001111 | 1011011w | modregr/m
MOVZXreg32, r/m1600001111 | 1011011w | modregr/m
XLAT-11010111
XLATB-11010111
LEAreg16/32, mem16/3210001101 | modregr/m (только для mod != 11)
LDSreg16/32, mem16/3211000101 | modregr/m (только для mod != 11)
LESreg16/32, mem16/3211000100 | modregr/m (только для mod != 11)
LFSreg16/32, mem16/3200001111 | 10110100 | modregr/m (только для mod != 11)
LGSreg16/32, mem16/3200001111 | 10110101 | modregr/m (только для mod != 11)
LSSreg16/32, mem16/3200001111 | 10110010 | modregr/m (только для mod != 11)

Команды арифметических операций
Мнемокод Операнд Код
ADDr/m, reg000000dw | modregr/m
ADDacc, imm0000010w | data
ADDr/m, imm100000sw | mod000r/m | data
ADCr/m, reg000100dw | modregr/m
ADCacc, imm0001010w | data
ADCr/m, imm100000sw | mod010r/m | data
SUBr/m, reg001010dw | modregr/m
SUBacc, imm0010110w | data
SUBr/m, imm100000sw | mod101r/m | data
SBBr/m, reg000110dw | modregr/m
SBBacc, imm0001110w | data
SBBr/m, imm100000sw | mod011r/m | data
CMPr/m, reg001110dw | modregr/m
CMPacc, imm0011110w | data
CMPr/m, imm100000sw | mod111r/m | data
MULr/m1111011w | mod100r/m
IMULr/m1111011w | mod101r/m
IMULreg16/32, r/m16/3200001111 | 10101111 | mоdregr/m
IMULreg16/32, r/m16/32, imm16/32011010s1 | mоdregr/m | data
DIVr/m1111011w | mod110r/m
IDIVr/m1111011w | mod111r/m
CBW-11010101
CWDE-11010101
CWD-10011001
CDQ-10011001
AAA-00110111
AAS-00111111
AAM-11010100 00001010
AAD-11010101 00001010
DAA-00100111
DAS-00101111
INCr/m1111111w | mod000r/m
INCreg16/3201000reg
DECr/m1111111w | mod001r/m
DECreg16/3201001reg
NEGr/m1111011w | mod011r/m

Команды логических операций и сдвигов
Мнемокод Операнд Код
ANDr/m, reg001000dw | modregr/m
ANDacc, imm0010010w | data
ANDr/m, imm100000sw | mod100r/m | data
ORr/m, reg000010dw | modregr/m
ORacc, imm0000110w | data
ORr/m, imm100000sw | mod001r/m | data
XORr/m, reg001100dw | modregr/m
XORacc, imm0011010w | data
XORr/m, imm100000sw | mod110r/m | data
NOTr/m1111011w | mod010r/m
TESTr/m, reg1000010w | modregr/m
TESTacc, imm1010100w | data
TESTr/m, imm1111011w | mod000r/m | data
SALr/m, 11101000w | mod100r/m
SALr/m, CL1101001w | mod100r/m
SALr/m, imm81100000w | mod100r/m | data
SARr/m, 11101000w | mod111r/m
SARr/m, CL1101001w | mod111r/m
SARr/m, imm81100000w | mod111r/m | data
SHLr/m, 11101000w | mod100r/m
SHLr/m, CL1101001w | mod100r/m
SHLr/m, imm81100000w | mod100r/m | data
SHRr/m, 11101000w | mod101r/m
SHRr/m, CL1101001w | mod101r/m
SHRr/m, imm81100000w | mod101r/m | data
ROLr/m, 11101000w | mod000r/m
ROLr/m, CL1101001w | mod000r/m
ROLr/m, imm81100000w | mod000r/m | data
RORr/m, 11101000w | mod001r/m
RORr/m, CL1101001w | mod001r/m
RORr/m, imm81100000w | mod001r/m | data
RCLr/m, 11101000w | mod010r/m
RCLr/m, CL1101001w | mod010r/m
RCLr/m, imm81100000w | mod010r/m | data
RCRr/m, 11101000w | mod011r/m
RCRr/m, CL1101001w | mod011r/m
RCRr/m, imm81100000w | mod011r/m | data
SHLDr/m16/32, reg16/32, imm800001111 | 10100100 | modregr/m | data
SHLDr/m16/32, reg16/32, imm800001111 | 10100101 | modregr/m
SHRDr/m16/32, reg16/32, imm800001111 | 10101100 | modregr/m | data
SHRDr/m16/32, reg16/32, imm800001111 | 10101101 | modregr/m

Команды битовых и байтовых операций
Мнемокод Операнд Код
BTr/m16/32, reg16/3200001111 | 10100011 | mоdregr/m
BTr/m16/32, imm800001111 | 10111010 | mоd100r/m | data
BTSr/m16/32, reg16/3200001111 | 10111011 | mоdregr/m
BTSr/m16/32, imm800001111 | 10111010 | mоd111r/m | data
BTRr/m16/32, reg16/3200001111 | 10110011 | mоdregr/m
BTRr/m16/32, imm800001111 | 10111010 | mоd110r/m | data
BTCr/m16/32, reg16/3200001111 | 10101011 | mоdregr/m
BTCr/m16/32, imm800001111 | 10111010 | mоd101r/m | data

Команды операций со строками символов
Мнемокод Операнд Код
LODSB-10101100
LODSW-10101101
LODSD-10101101
STOSB-10101010
STOSW-10101011
STOSD-10101011
MOVSB-10100100
MOVSW-10100101
MOVSD-10100101
INSB-01101100
INSW-01101101
INSD-01101101
OUTSB-01101110
OUTSW-01101111
OUTSD-01101111
SCASB-10101110
SCASW-10101111
SCASD-10101111
CMPSB-10100110
CMPSW-10100111
CMPSD-10100111
REP-11110011
REPE-11110011
REPZ-11110011
REPNE-11110010
REPNZ-11110010

2. Операции управления

Команды передачи управления и прерывания
Мнемокод Операнд Код
JMP NEARdisp8/16/32111010s1 | data
JMP NEARr/m16/3211111111 | mod100r/m
JMP FARdisp16:disp16/3211101010 | data
JMP FARr/m16:16/3211111111 | mod101r/m
CALL NEARdisp8/16/3211101000 | data
CALL NEARr/m16/3211111111 | mod010r/m
CALL FARdisp16:disp16/3210011010 | data
CALL FARr/m16:16/3211111111 | mod011r/m
RET NEAR-11000011
RET NEARdisp1611000010 | data
RET FAR-11001011
RET FARdisp1611001010 | data
RET FARdisp1611001010 | data
Jccdisp80111cccc | data
Jccdisp16/3200001111 | 1000сссс | data
JCXEdisp811100011 | data
LOOPdisp811100010 | data
LOOPEdisp811100001 | data
LOOPZdisp811100001 | data
LOOPEdisp811100000 | data
LOOPZdisp811100000 | data
INTimm811001101 | data
INT311001100
INTO-11001110
IRET-11001111
IRETD-11001111

Команды управления флагами
Мнемокод Операнд Код
CLI-11111010
STI-11111011
CLC-11111000
STC-11111001
CMC-11110101
CLD-11111100
STD-11111101
LAHF-10011111
SAHF-10011110
PUSHF-10011100
PUSHFD-10011100
POPF-10011101
POPFD-10011101

Команды поддержки языков высокого уровня и управления защитой памяти
Мнемокод Операнд Код
BOUNDreg16/3201100010 | mоdregr/m
ENTERimm16, imm811001000 | data | data
LEAVE-11001001
LGDTmem1600001111 | 00000001 | mod010r/m
SGDTmem1600001111 | 00000001 | mod000r/m
LIDTmem1600001111 | 00000001 | mod110r/m
SIDTmem1600001111 | 00000001 | mod001r/m
LLDTr/m1600001111 | 00000000 | mod010r/m
SLDTr/m1600001111 | 00000000 | mod000r/m
LTRr/m1600001111 | 00000000 | mod011r/m
STRr/m1600001111 | 00000000 | mod001r/m
CLTS-00001111 | 00000110
LARreg16/reg32, r/m16/3200001111 | 00000010 | mоdregr/m
LSLreg16/reg32, r/m16/3200001111 | 00000011 | mоdregr/m
ARPLr/m16, reg1601100011 | mоdregr/m
VERRr/m1600001111 | 00000000 | mod100r/m
VERWr/m1600001111 | 00000000 | mod101r/m

Команды управления процессором и префиксные байты
Мнемокод Операнд Код
LMSWr/m1600001111 | 00000001 | mod110r/m
SMSWr/m1600001111 | 00000001 | mod100r/m
NOP-10010000
HLT-11111000

3. Таблицы для удобной работы с операндами

Типы операндов
Код Имя Описание
0-Нет операнда
1r/mРегистр-память (8-ми, 16-ти или 32-х разрядные)
2regРегистр (8-ми, 16-ти или 32-х разрядный)
3memПамять
4segСегментный регистр
5accРегистр аккумулятор
6immНепосредственные данные
7dispСмещение
8sysСистемный регистр

Общий формат команд
Код MODR/M SIB DISP IMM
1 или 2 байта0 или 1 байт0 или 1 байт0, 1, 2 или 4 байта0, 1, 2 или 4 байта

Биты, влияющие на код операции
Имя Описание
dd = 0 - reg/код - источник, r/m - приёмник, d = 1 - наоборот
ww = 0 - 8 бит, w = 1 - 16/32 бита
ss = 1 - imm8, s = 0 - imm16/32
gg = 1 - отладочный системный регистр
tt = 1 - тестовый системный регистр

Формат байта MODR/M
7 6 5 4 3 2 1 0
modreg/кодr/m

Формат байта SIB
7 6 5 4 3 2 1 0
ssindexbase

Кодировка регистров общего назначения (поля reg)
reg w=0 (8 бит) w=1 (16 бит) w=1 (32 бит)
000ALAXEAX
001CLCXECX
002DLDXEDX
003BLBXEBX
004AHSPESP
005CHBPEBP
006DHSIESI
007CHDIEDI

Назначение поля seg (3 бита)
seg регистр
000ES
001CS
010SS
011DS
100FS
101GS

Кодировка поля sys - системные регистры CRi, DRi, TRi (3 бита)
sys CRi DRi TRi
000CR0DR0-
001-DR1-
010CR2DR2-
011CR3DR3-
100---
101---
110-DR6TR6
111-DR7TR6

Назначение поля r/m для 16-ти битного режима
r/m mod=00 mod=01 mod=10
000 [BX+SI] [BX+SI+disp8] [BX+SI+disp16]
001 [BX+DI] [BX+DI+disp8] [BX+DI+disp16]
010 [BP+SI] [BP+SI+disp8] [BP+SI+disp16]
011 [BP+DI] [BP+DI+disp8] [BP+DI+disp16]
100 [SI] [SI+disp8] [SI+disp16]
101 [DI] [DI+disp8] [DI+disp16]
110 [disp16] [BP+disp8] [BP+disp16]
111 [BX] [BX+disp8] [BX+disp16]
Примечание: Для mod = 11 поле r/m рассматривается как reg.

Назначение поля r/m для 32-х битного режима
r/m mod=00 mod=01 mod=10
000 [EAX] [EAX+disp8] [EAX+disp16]
001 [ECX] [ECX+disp8] [ECX+disp16]
010 [EDX] [EDX+disp8] [EDX+disp16]
011 [EBX] [EBX+disp8] [EBX+disp16]
100 см. табл. ниже см. табл. ниже см. табл. ниже
101 [disp32] [EBP+disp8] [EBP+disp32]
110 [ESI] [ESP+disp8] [ESP+disp32]
111 [EDI] [EDI+disp8] [EDI+disp32]
Примечание: Для mod = 11 поле r/m рассматривается как reg.

Назначение поля base, для r/m = 100 (32-х битный режим)
r/m mod=00 mod=01 mod=10
000[EAX+(IR*F)][EAX+(IR*F)+disp8][EAX+(IR*F)+disp32]
001[ECX+(IR*F)][ECX+(IR*F)+disp8][ECX+(IR*F)+disp32]
010[EDX+(IR*F)][EDX+(IR*F)+disp8][EDX+(IR*F)+disp32]
011[EBX+(IR*F)][EBX+(IR*F)+disp8][EBX+(IR*F)+disp32]
100[ESP+(IR*F)][ESP+(IR*F)+disp8][ESP+(IR*F)+disp32]
101[disp32+(IR*F)][EBP+(IR*F)+disp8][EBP+(IR*F)+disp32]
110[ESI+(IR*F)][ESI+(IR*F)+disp8][ESI+(IR*F)+disp32]
111[EDI+(IR*F)][EDI+(IR*F)+disp8][EDI+(IR*F)+disp32]

Кодировка масштабного множителя F
ss F
001
012
104
118

Кодировка индексного регистра IR в байте SIB
index IR
000EAX
001ECX
010EDX
011EBX
100-
101EBP
110ESI
111EDI

Разрядность операндов и относительных адресов в защищённом режиме
Значение бита d00001111
Префикс OS (66H)--++--++
Префикс AS (67H)-+-+-+-+
Разрядность операнда1616323232321616
Разрядность адреса1632163232163216

Формирование команд условных переходов
ccccМнемоника Jcc
0000JO
0001JNO
0010JB, JNAE
0011JNB, JAE
0100JE, JZ
0101JNE, JNZ
0110JBE, JNA
0111JNBE, JA
1000JS
1001JNS
1010JP, JPE
1011JNP, JPO
1100JL, JNGE
1101JNL, JGE
1110JLE, JNG
1111JNLE, JG

Буду очень благодарен, если вы укажите ошибки, которые могли возникнуть при опубликовании этих таблиц.

Hosted by uCoz