70 4. Język asemblerowy mikroprocesorów 8086/8088
.186 - procesory 80186/80188
J86c - procesor 80286, tryb adresowania rzeczywistego
J86p - procesor 80286, tryb adresowania wirtualnego
.8087 - koprocesor 8087
.287 - koprocesor 80287
Asembler MASM rozróżnia wyrażenia numeryczne oraz adresowe. Operatory występujące w poszczególnych wyrażeniach można podzielić na: j
- operatory stosowane wyłącznie w wyrażeniach adresowych
przedrostek rejestru segmentowego, OFFSET, SEG, TYPE, LENGHT, S1ZE;
- operatory stosowane wyłącznie w wyrażeniach numerycznych
*, /, MOD, SHL, SHR, OR, XOR, AND, NOT, SHORT; Ä„
• operatory stosowane w obu typach ww. wyrażeń
EQ, LT, LE, GT, GE, NE, +, - (także jako znak liczby), HIGH, LOW, PTR;
- operatory związane z chwilową wartością wskaźnika pozycji 1
- operatory zwiÄ…zane z dyrektywÄ… RECORD
Podczas obliczania wartości wyrażenia obowiązują następujące reguły
- wyrażenia są obliczane od strony lewej do prawej, 1
- operatory o wyższym priorytecie są realizowane przed sąsiadującymi operatorami o priorytecie niższym,
- kolejność obliczeń można zmienić za pomocą nawiasów okrągłych - część wyrażenia
zamknięta w nawiasach jest obliczana w pierwszej kolejności, 1
- jeżeli obok siebie znajduje się więcej wyrażeń w parach nawiasów okrągłych, to są one obliczane od lewej strony do prawej,
Priorytety operatorów oraz nawiasów (w kolejności od najwyższego do najniższego)
1. nawiasy okrągłe, LENGHT, SIZE, WIDTH, MASK, SHIFT, nawiasy trójkątne
2. przedrostki rejestrów segmentowych, PTR, OFFSET, SEG, TYPE, THIS
4. V, SHL, SHR
5. +,- (także jako znaki liczb) J
6. EQ, LT, LE, GT, GE, NE
7. NOT
8. AND
9. OR, XOR
10. SHORT
Dla operatorów wymienionych w pozycji 1 i 2 poszczególne argumenty mogą dodatkowo obejmować następujące słowa kluczowe: BYTE, WORD, DWORD,
powered by
4.4. Wyrażenia i operatory
NEAR, FAR, $ oraz wskazanie adresu. Wszystkie operatory, których zapis jest literowy, muszą być odseparowane od argumentów co najmniej jedną spacją.
Przedrostek rejestru segmentowego
Jak już wspomniano, adres Fizyczny w pamięci operacyjnej jest tworzony na podstawie offsetu oraz zawartości jednego z rejestrów segmentowych. Rejestry segmentowe są przypisane do poszczególnych operacji w sposób standardowy (p. 2.5). Jeżeli ma być użyty rejestr segmentowy inny niż standardowy bądź też nie została zdefiniowana dyrektywa ASSUME, to argumenty muszą być poprzedzone przedrostkiem (1 bajt)
rejestrsegmentowyiwyrażenieadresowe
przy czym rejestr segmentowy jest jednym z rejestrów CS, SS, DS lub ES.
Operator OFFSET
Operator OFFSET wydziela z wyrażenia adresowego adres względem początku segmentu (np. OFFSET ZMIENNAl) lub grupy segmentów (np. OFFSET GRUPA.ZMIENNA). W czasie asemblacji adres względem początku segmentu nie ulega zmianie, jednak w trakcie łączenia modułów wynikowych może zostać zmieniony (np. w wyniku napotkania dyrektywy GROUP). Program łączący uwzględnia te ewentualne zmiany i z tego też względu w programie źródłowym nie powinno używać się wyliczonych, absolutnych wartości offsetu a jedynie wyrażenia z operatorem OFFSET. Adres względem początku segmentu nic może być określany operatorem OFFSET, o ile jego wartość zmienia się w czasie realizacji programu (np. offset z ZMIENNA! BX]). W takim przypadku jest pomocny rozkaz maszynowy LEA (ang. load effec-tive addresss ).
Przykład
GRUPA GROUP DANE,PROGRAM
PROGRAM SEGMENT BYTE
ASSUME CSiPROGRAM, DS:GRUPA • ••
MOV BX,OFFSET ZMIENNA TAB MOV DI.1ÓH MOV AX,[BX][DI]
• ••
MOV BX,OFFSET GRUPA:ZMIĆNNA TAB MOV DI,OFFSET ES:STALA • • •
PROGRAM ENDS Orator SEG
Operator SEG wydziela z wyrażenia adresowego 16-bitowy adres początku ^gmentu podzielony przez 16 (ang.paragraph ).