Curs 4 1

Un operand. Să analizăm comanda care definește un singur operan, de exemplu, comanda INC. De obicei, este folosit pentru a crește indicele sau registrul indexului la calcularea offseturilor și

- 16 biți RON în operațiuni aritmetice. Cu astfel de operanzi, comanda ia o formă foarte simplă de un octet, prezentată în Fig. 2.8. Are un câmp reg de 3 biți, care definește unul dintre cele opt registre de 16 biți. Codificarea registrelor în câmpul reg este prezentată în primele două coloane din tabel. 2.1.

Tabelul 2.1 Codificarea registrelor

În forma cea mai generală, comanda INC poate crește conținutul oricărui registru RON, index sau index (8 sau 16 biți) și orice cuvânt octet sau memorie. Această formă de două octeți în lungime este prezentată în Fig. 2.10. Acum, câmpul CPC este împărțit în două părți: cele șapte biți sunt în primul octet, iar trei în cel de-al doilea. INC comanda opcode este într-o formă 000. 1111111 w-bit câmp determină lungimea operandului: dacă w = 0, operandul are 8 biți, iar când w = 1 - 16 biți. Câmpul mod indică dacă operandul este în registru sau în memorie. Dacă mod = 11, operandul se află în registru, iar celelalte trei combinații ale câmpului mod sunt memorie. Atunci când operandul se află în registru, câmpul r / t afișează un registru specific; și dacă operandul este în memorie, același câmp determină unde este localizat (scurtarea r / t înseamnă registru / memorie).

Tabelul 2.3 Registrele bazei și indexului definite de câmpul r / t pentru operanții din memorie (mod 11)

De exemplu, luați în considerare comanda prezentată în Fig. 2.12. Câmpul codului de operare conține 1111111 000 și definește comanda INC. Câmpul w = 1 arată lungimea operandului de 16 biți. Câmpul mod = 01 și operand, prin urmare, este în memorie; În plus, offsetul din comandă de la următorul octet trebuie extins cu un semn de până la 16 biți: 0000 0000 0101 1100.

Câmpul r / t = 100, prin urmare, cu compensare în comandă, este necesar să însumăm conținutul registrului SI (să ​​fie egal cu 1010 0000 1000 0110);

+ 1010 0000 1000 0110 (conținutul SI)

0000 0000 0101 1100 (offset în echipă)

1010 0000 1110 0010 (rezultat)

+ 1111 0000 1111 0000 (segment)

1010 0000 1110 0010 (offset în segment)


Operandul nu trebuie sa fie doar in datele curente si segmentele de stivuire. Se poate citi din orice segment introducând un prefix de un octet care indică registrul de segmente înaintea comenzii (Figura 2.13). În Fig. 2.14 prezintă aceeași comandă ca în Fig. 2.12, dar acum operandul este în segmentul suplimentar curent.

Doi operanzi. Având în vedere comenzile cu un singur operator, să examinăm comenzile care au doi operanzi, de exemplu ADD. Am spus deja că această comandă ia valoarea unui operand, o adaugă la valoarea celui de-al doilea operand și stochează rezultatul în locul oricărui operand. Dacă permiteți ca ambii operanzi să fie în memorie, comanda ar necesita câmpurile mod și r / t pentru fiecare dintre ele. Pentru a scurta lungimea comenzilor, sa decis ca cel puțin unul dintre operanzi să fie în registru. Apoi, comanda necesită câmpurile mod și r / m pentru un singur operand, iar pentru celălalt câmpul reg este suficient (Figura 2.16).

Câmpul w indică dacă operanzii sunt octeți (w = 0) sau cuvinte (w = 1). În comanda a apărut un nou câmp d (receptor); dacă d = 0, rezultatul este stocat în operandul definit de câmpurile mod și r / m și dacă d - 1 - în operandul definit de câmpul reg. Operandul in care rezultatul este stocat se numeste receptor, iar celalalt operand se numeste sursa.

De exemplu, luați în considerare comanda ADD prezentată în Fig. 2.17. Are un cod de operare de 000000. Câmpul w = 0 indică faptul că ambii operanzi sunt octeți. Câmpul reg al operandului reg este registrul CH. Câmpul mod = 11 înseamnă că câmpurile mod și r / m definesc registrul, iar câmpul r / t specifică registrul BL. Câmpul d = 1 arată înregistrarea rezultatelor în operand, definită de câmpul reg, adică în registrul CH. Prin urmare, comanda adaugă conținutul registrului BL (sursă) la conținutul registrului CH (receptor) și plasează rezultatul în CH.


Un exemplu de comandă cu operand direct este comanda MOV (înainte). Este adesea folosit pentru a încărca o constantă într-un registru. Aici, operandul imediat poate fi determinat de câmpul reg, iar comanda dobândește forma simplă prezentată în Fig. 2.18. Câmpul w definește încă lungimea biților operand 8 (w = 0) sau 16 (w = 1); în primul caz, operandul imediat ocupă un octet în instrucțiune, iar în al doilea - doi octeți. Ca exemplu, în Fig. 2.19 este prezentată o comandă care transferă valoarea 1111 0000 0000 1111 în registrul DI.


Într-o comandă oarecum mai complexă, operand-receptorul este definit de câmpurile mod și r / m în loc de câmpul reg, deci un alt octet apare în comandă (a se vedea Figura 2.20). Cel prezentat în Fig. 2.21 comanda trimite valoarea 1111 0000 0000 1111 la cuvântul din offsetul segmentului de date din registrul DI.

Deoarece două instrucțiuni de operand au doar un câmp w, ambii operanzi trebuie să aibă o lungime de 8 sau 16 biți. Cu toate acestea, operanzii imediați sunt adesea numere mici și nu necesită 16 biți. Această afirmație este valabilă mai ales pentru comenzile de adăugare, scădere și comparație, deși, de obicei, nu este menținută pentru operanzii de instrucțiuni logice. Prin urmare, este posibil să se diminueze dimensiunea instrucțiunilor cu operanții imediați, cu excepția cazului în care 16 biți sunt rezervate pentru stocarea de numere mici. Prin urmare, în unele comenzi (adunare, scădere și comparație) se introduce bitul s (înseamnă "cu extensia semnului"). Ea ia locul bitului d, deoarece în comenzile cu operanzi direcți este posibilă o singură direcție. Câmpul s are semnificație doar pentru operanzii pe 16 biți (w = 1) și indică dacă toți 16 biți ai operandului imediat (s = 0) sau doar 8 biți (s = 1) care urmează să fie expandați cu un semn de până la 16 biți pentru a forma un operand de 16 biți. Această formă a comenzii este ilustrată în Fig. 2.22. Exemplul corespunzător este prezentat în Fig. 2.23. Aici, valoarea cuvântului din memorie este atașată cu valoarea 0000 0000 0000 1111 și rezultatul este plasat în același cuvânt. Cuvântul este în segmentul de date, iar offsetul său este luat din registrul DI. Rețineți că, datorită bitului, se salvează un octet.

Articole similare