42256

EMBED PBrush

Лабораторная работа

Информатика, кибернетика и программирование

rry1 db 123423 rry2 db 1500 dup rry3 db 2000 dup 56h В першому випадку кожний елемент масиву ініціалізується незалежно. Багатовимірний масив задається шляхом використання вкладених повторень dup наприклад r1 db 4 dup 3 dup 2 dup В мові Паскаль це еквівалентно наступному оператору r1:rry[0. Наприклад Instr32 struc Opcode dw Modrm db Sib db Disp dd Instr32 ends Сама структура задається в форматі директив визначення даних де в полі мнемокода задається ім'я структури наприклад In1 instr32 Або Min1 instr32 5...

Русский

2013-10-30

1007.5 KB

14 чел.

PAGE  218

EMBED PBrush  

Лабораторна робота N3

Мета роботи

Вивчення типових структур даних та методів адресації елементів цих структур в мікропроцесорах 80х86 (Pentium) в реальному режимі.

Необхідні апаратні й програмні засоби:

  •  ПЕОМ на мікропроцесорі 80х86 (Pentium);
  •  операційна система Windows;
  •  макроасемблер МАSM (файл masm. exe), або TASM (файл tasm. exe)
  •  редактор  зв'язків (компоновщик) LINK (файл link. exe), або TLINK (файл tlink.exe)
  •  налагоджувач AFD (файл afd. exe), або TDEBUG (файл td. exe),;
  •  редактор текстів (наприклад, додаток Блокнот ).

Інформаційні матеріали:

  •  лекції по курсу "Системне програмування";
  •  посібник із мови Асемблера, (наприклад. кн.  ASSEMBLER. Учебный курс. В.Юров, С.Хорошенко, урок 6, Система команд микропроцесора);

  1.  Зміст роботи.

В роботі студенти вивчають створення та використання в мові Асемблера багатовимірних масивів, структур та масивів структур. Для доступу до елементів складних структур даних вивчаються режими адресації та команди обробки адрес. З навчальною метою на мові Асемблера створюються програми, які складаються з багатьох логічних сегментів. На конкретних прикладах вивчаються проблеми, які виникають при об’єднані логічних сегментів в один фізичний сегмент.

  1.   Довідкові дані
    1.  Створення в мові Асемблера багатовимірних масивів. , структур та масивів структур.
      1.  Директиви визначення простих даних

Асемблер надає дуже широкий набір засобів подання й обробки даних, які по своїх можливостях не гірші від аналогічних засобів багатьох мов високого рівня. Спочатку розглянемо із правил опису простих типів даних, які являються базовими для опису більш складних типів. Для опису простих типів  даних в програмі використовують спеціальні директиви резервування й ініціалізації даних. Якщо проводити аналогію з мовами високого рівня, то директиви резервування й ініціалізації даних являють визначенням змінних. Машинного еквіваленту цим директивам не має, просто транслятор, обробляючи кожну таку директиву,  виділяє необхідну кількість пам’яті й, при необхідності, ініціалізує цю область деяким значенням. Директиви резервування й ініціалізації даних простих типів мають формат, показаний на малюнку.

На малюнку представлені директиви резервування й ініціалізації даних, які підтримуються Tasm:

  •  db – резервування пам’яті для даних розміром 1 байт.
  •  dw - резервування пам’яті для даних розміром 2 байт.
  •  dd - резервування пам’яті для даних розміром 4 байт.
  •  df - резервування пам’яті для даних розміром 6 байт.
  •  dp - резервування пам’яті для даних розміром 6 байт.
  •  dq - резервування пам’яті для даних розміром 8 байт.
  •  dt - резервування пам’яті для даних розміром 10 байт.  

Masm, залежно від версії, директиви df та dp не підтримує.

Дуже важливо уяснити собі порядок розміщення байтів багатобайтних даних в пам’яті . Він прямо зв’язаний із логікою роботи мікропроцесора з даними. Мікропроцесори 80х86 використовують наступний порядок розміщення багатобайтних даних в пам’яті:- молодший байт по молодшій адресі.

Крім того, на малюнку використані наступні позначення:

  •   ? показує , що вміст поля не визначено, тобто при завданні директиви з таким значенням виразу вміст виділеної частини фізичної пам’яті при завантаженні програми змінюватися не буде. Фактично створюється не ініціалізована змінна. Операційні системи в багатьох випадках попередньо обнуляють область пам’яті, в яку завантажуються програми, але розраховувати на це не слід.
  •  значення ініціалізації – значення елемента даних, котре буде занесено в пам’ять після завантаження програми. Фактично створюється ініціалізована змінна, в якості ініціалізації можуть виступати константи, строки символів, константні й адресні вирази в залежності від типу даних.
  •  Вираз – ітеративна конструкція із синтаксисом, описаним на малюнку.
  •  ім’я – ідентифікатор користувача, який репрезентує адресу або константу, і який визначений в програмі, наприклад

Value1 db ?

….

P1 Dw Value1

P2 DD Value1

P3 dw @10

P4 dd @10

По адресі P1 транслятором буде згенеровано зміщення в сегменті зарезервованої комірки пам’яті, а по адресі P2 – повна логічна адреса зарезервованої комірки пам’яті. Аналогічно в випадку мітки @10.

  1.  Визначення масивів

Згідно з малюнком для завдання одновимірних масивів можна використати методи, які пояснюються наступними прикладами.

Array1 db 1,2,3,4,2,3

Array2 db 1500 dup (?)

Array3 db 2000 dup (56h)

В першому випадку кожний елемент масиву ініціалізується незалежно. В другому випадку масив Array2 не ініціалізується, в третьому випадку всі елементи масиву ініціалізуються значенням 56h. При цьому кількість елементів в масиві дорівнює кількості повторень.

Багатовимірний масив задається шляхом використання вкладених повторень (dup), наприклад

Ar1  db 4 dup (3 dup (2 dup (?)))

В мові Паскаль це еквівалентно наступному оператору

Ar1:array[0..3,0..2,0..1) of byte;

Звідси можна вважати, що в мові Асемблера всі індекси в масивах розпочинають свої значення з 0. Оскільки ОЗП є по суті одновимірним масивом комірок, то можуть виникати розбіжності в розміщені елементів багатовимірних масивів в одновимірному масиві комірок. При програмуванні на мовах високого рівня формування адрес комірок покладається на компілятор, програмісту необхідно слідкувати лише за порядком індексів при зверненні до елементу багатовимірного масиву. Тому порядок розміщення елементів багатовимірних масивів в одновимірному масиві комірок не має суттєвого значення. При програмуванні на мові Асемблера програміст вимушений сам формувати адреси елементів багатовимірних масивів. Тому вказаний порядок має першочергове значення. В програмуванні, як правило, прийнято наступний порядок розміщення елементів багатовимірного масиву в одновимірному масиві комірок ОЗП, згідно із прикладом, наведеним в Табл. 1, де перша строчка містить адресу (зміщення) елементу масиву відносно початку масиву, а друга строчка – значення індексів.

В загальному випадку зміщення елементу масиву відносно початку масиву, згідно з вказаним порядком, обчислюється по наступній формулі:

O=(I1*(P2)+ I2*(P3)+ I3*(P4)+ …+In-1*(Pn)+ In)*T    (1)

Де

I1 , I2 ,…, In – індекси n-вимірного масиву (вважається, що індекси змінюються починаючи з 0);

Pj  (j=2,3,…,n) - добуток розмірів вимірів масиву від j до n включно;

T - тип (кількість байтів в одному елементі масиву).

Для масиву Ar1 ця формула матиме наступний вигляд

О=( I1*6+ I2*2 + I3)

Таблиця 1

Ar1+0

Ar1+1

Ar1+2

Ar1+3

Ar1+4

Ar1+5

…..

Ar1+22

Ar1+23

0,0,0

0,0,1

0,1,0

0,1,1

0,2,0

0,2,1

…..

3,2,0

3,2,1

Окрім формули (1) в програмуванні часто використовується так звана схема Горнера:

O=((...(( I1 *D2 + I2 )*D3 + I3 )*D4+...)*Dn+ In )*T    (2)

Для масиву Ar1 ця формула матиме наступний вигляд

О=( I1 3+ I2)*2+ I3

Схема Горнера може бути ефективнішою ніж (1), особливо при великій кількості вимірів

Із Табл 1. та формул (1), (2) випливає, що для послідовного, по розташуванні в ОЗП, перегляду елементів масиву зміна індексів розпочинається з In в напрямку до I1  .

  1.  Визначення структур та масивів структур

Недоліком масивів при вирішенні, зокрема, задач системного програмування є однотипність всіх елементів. Якщо в складних структурах даних елементи є різнотипними то використовуються структури та масиви структур. В мові Асемблера перед використанням структури, повинен бути попередньо заданий шаблон структури. Шаблон структури має наступний формат

Name_st struc

Директиви визначення простих даних або масивів

Name_st ends

Де Name_st - оригінальний ідентифікатор користувача- ім'я структури.

Наприклад

Instr32 struc

Opcode dw ?

Modrm db ?

Sib  db ?

Disp  dd ?

Instr32 ends

Сама структура задається в форматі директив визначення даних, де в полі мнемокода задається ім'я структури, наприклад

In1 instr32 <>

Або

Min1 instr32 5 dup(<>)

В розглянутих прикладах задавалось лише резервування пам'яті без початкової ініціалізації. Детальніше про структури в мові Асемблера можна познайомитись, наприклад, в книзі

ASSEMBLER. Учебный курс. В.Юров, С.Хорошенко, урок 12, Сложные структуры данных.

В мові Асемблера існують спеціальні оператори часу трансляції, які використовуються для визначення кількісних характеристик масивів. До таких операторів належать

LENGTH – визначає кількість елементів даних в масиві.

SIZE – визначає кількість байтів масиву

TYPE - визначає кількість байтів на елемент.

Наприклад

table    dw      0,1,2,3,4,5,6,7 ;

mov ax,length table;  ax=8

mov ax,size table;  ax=16

mov ax,type table; ax:=2

Або

mov ax,type instr32;ax:=8

mov ax,type Min1;ax:=8

mov ax,length Min1;  ax=5

mov ax,size table;  ax=40

Отже

SIZE <array>= LENGTH <array> * TYPE <array>

  1.   Засоби адресації простих даних та елементів складних даних

Переважна більшість команд процесорів 80х86 мають в своїй структурі адресну частину, яка в загальному випадку містить байти modr/m, sib та зміщення в команді. На основі цих даних процесор формує зміщення в сегменті, яке в даному випадку назвали ефективною адресою. В загальному випадку ефективна адреса є сумою трьох компонент – зміщення в команді, бази та індексу. База та індекс містяться в регістрах загального призначення, які використовуються як адресні регістри. Індекс може мати множник 2,4 або 8, який показує, на яку величину необхідно помножить вміст 32-розрядного індексного регістра перед формуванням ефективної адреси. Для 16-розрядних регістрів множник не задається.

Будь-яка з компонент в адресному виразі може бути відсутня, що визначає наступні режими адресації:

Зміщення в команді

База

Індекс

Режим адресації

Приклад

-

-

+

Посередня регістрова

[si], [еах]

[esp]

-

+

+

Базова індексна

[bx+si],

[ecx+edx]

[ebx+esi*4]

-

+

-

Посередня регістрова

[bx], [ecx]

+

-

+

Індексна

Dat1[si]

Dat1[ecx]

Dat1[edi*8]

+

-

-

Пряма

Dat1

+

+

+

Базова індексна зі зміщенням

Dat1[bx+di]

Dat1[ebx][edx]

Dat1[edx+esi*2]

+

+

-

Базова

[bp+4], [bp-6]

[ecx+7]

Примітка 1. Для формування ефективної адреси можуть використовуватись лише регістри BP, BX, SI і DI , а також лише наступні їх пари – BX+SI, BX+DI,BP+SI та BP+DI. Відносно 32-розрядних регістрів загального призначення, то обмеження на їх використання відсутнє, за виключенням наступного – регістр ESP не може задаватись із множником.

Примітка 2. На мові Асемблера можна задати посередню регістрову адресацію із множником, наприклад, Add   eax,[edx*4], але в процесорі такі команди відсутні. Асемблер сформує машинну команду, в якій буде зміщення в команді з нульовим значенням.

При програмуванні на мові Асемблера розглянуті режими адресації доцільно використовувати наступним чином:

  •  Пряму – для адресації простих (скалярних) даних, адреси яких при виконанні програми не змінюються
  •  Посередню регістрову - для адресації скалярних даних, адреси яких змінюються при виконанні програми.
  •  Індексну – для адресації елементів масивів. Особливо ефективно можна використовувати індексну адресацію для доступу до елементів одновимірних байтових масивів, масивів слів, подвійних та квадрослів.
  •  Базову – для адресації елементів структур, відносні адреси яких при виконанні програми не змінюються
  •  Базову індексну - для адресації елементів структур, відносні адреси яких змінюються при виконанні програми
  •  Базову індексну зі зміщенням – для адресації елементів масивів структур , або для адресації елементів багатовимірних масивів.

Обчислення адрес елементів складних структур даних, таких як багатовимірні масиви, списки, графи, дерева й т.п. в загальному випадку може бути достатньо трудомістким. Тому в склад команд процесора включені команди LEA та багатооперандна команда IMUL. Команда LEA має наступний формат

 LEA приймач, джерело

Операнд приймач - 16-розрядний регістр (як правило адресний), або 32-розрядний регістр. Операнд джерело – адресний операнд мови Асемблера.

Алгоритм роботи команди:

  1.  Якщо 16-розрядний приймач та 16-розрядна адресація, то в регістр приймач завантажується 16-бітне значення ефективної адреси;
  2.  Якщо 32- розрядний приймач та 16-розрядна адресація, то в молодші 16 розрядів регістра приймач завантажується 16-бітне значення ефективної адреси, а в старші 16 розрядів записується 0.
  3.  Якщо 16-розрядні дані та 32-розрядна адресація, то в регістр приймач завантажуються молодші 16-біт значення ефективної адреси;
  4.  Якщо 32-розрядні дані та 32-розрядна адресація, то в регістр приймач завантажується 32-бітне значення ефективної адреси;

Багатооперандна команда IMUL має наступні формати

IMUL множ_1,множ_2  

IMUL рез-т,множ_1,множ_2

Або детальніше

Структура команди

Приклад на асемблері

Imul r16,r/m16

Imul bx,word ptr[si]

Imul r32,r/m32

Imul eax,dword ptr[edx*8]

Imul r16,r/m16, imm8

Imul si,[bx],6

Imul r32,r/m32, imm8

Imul ecx,esi,11

Imul r16,imm8

Imul si,6

Imul r32,imm8

Imul edi,23

Imul r16,r/m16, imm16

Imul bx,dx,166h

Imul r32,r/m32, imm32

Imul ecx,esi,112233h

Imul r16,imm16

Imul si,166h

Imul r32,imm32

Imul edx,666777h

Команди з двома і трьома операндами однозначно визначають розташування результату і співмножників у такий спосіб:

  1.  У команді з двома операндами перший операнд визначає місце розташування першого співмножника. На його місце згодом буде записаний результат. Другий операнд визначає місце розташування другого співмножника - множ_1 = множ_1 * множ_2 ;
    1.  У команді з трьома операндами перший операнд визначає місце розташування результату, другий операнд - місце розташування першого співмножника, третій операнд може бути лише безпосередньо заданим значенням розміром у байт,  чи слово подвійне слово - множ_1 = множ_2 * множ_3 .

Команда іmul встановлює в нуль ознаки of і cf, якщо розмір результату відповідає регістру призначення. Якщо ці ознаки відмінні від нуля, то це означає, що результат занадто великий для відведених йому регістром призначення рамок, і старші розряди добутку ігноруються.. Але при обчисленні адрес така невідповідність малоймовірна, а в реальному режимі призведе лише до звернення до менших зміщень в сегменті (по кільцю).

Розглянемо приклади використання команди LEA та багатооперандної команди IMUL.

;завантажити в регістр ax елемент mas[i1,i2,i3]

.data

mas dw 10 dup (12 dup (14 dup (? )))

i1 dw ?

i2 dw ?

i3 dw ?

.code

imul bx,i1,12*14*2

imul ecx,i2,14*2

xor esi,esi

mov si,i3

lea di,[ecx+esi*2]

mov ax,mas[bx+di] ;ax:=mas[i1,i2,i3]

Команду IMUL із трьома операндами доцільно застосовувати для визначення адрес структур в масиві структур, наприклад

person  struc

name db 30 dup (?)

grup db 6 dup (?)

zalic db ?

person ends

base_person person 50 dup (<>)  

mov cx,50

@12:

imul si,cx,size person

mov byte ptr base_person[si-size person].zalic, '+'

loop @12

  1.  Група команд обробки одновимірних масивів (команди обробки рядків,ланцюгові команди).

Усі команди цієї групи є однобайтними, вони не мають адресної частини. Адреси операндів команд задаються не явно (фактично кодом операції). Кожна із цих команд має два операнда – або обидва в пам’яті, або один в акумуляторі, а другий в пам’яті.

Машинний код команди

Мнемоніка

Приймач

Джерело

Призначення

0A4h

movsb

пам’ять

пам’ять

Пересилання елементів масивів

0A5h

Movsw або

Movsd

пам’ять

пам’ять

Пересилання елементів масивів

0A6h

Сmpsb

пам’ять

пам’ять

Порівняння елементів масивів

0A7h

Cmpsw або

Cmpsd

пам’ять

пам’ять

Порівняння елементів масивів

0AEh

Scasb

пам’ять

Акумулятор

Порівняння елементу масиву з даними в акумуляторі

0AFh

Scasw або

Scasd

пам’ять

Акумулятор

Порівняння елементу масиву з даними в акумуляторі

0AAh

Stosb

пам’ять

Акумулятор

Занесення в елемент масиву даних з акумулятора

0ABh

Stosw або

Stosd

пам’ять

Акумулятор

Занесення в елемент масиву даних з акумулятора

0ACh

Lodsb

Акумулятор

пам’ять

Занесення в аккумулятор даних елемента масиву

0ADh

Lodsw або

Lodsd

Акумулятор

пам’ять

Занесення в аккумулятор даних елемента масиву

Особливістю цих команд є наступне.

  1.  Якщо операнд розташований в пам’яті, то в випадку джерела його логічна адреса  - DS:SI, а в випадку приймача - ES:DI
  2.  Після виконання команди вміст використаних регістрів (SI та/або DI) залежно від типу (b - byte, w-word, d - dword) автоматично змінюється (збільшується або зменшується) на 1, 2 або 4.
  3.  Збільшення відбувається, коли ознака df в регістрі ознак встановлена в 0, якщо ознака df встановлена в 1, то відбувається автоматичне зменшення.
  4.  Перед командами може використовуватись префікс повторення для організації апаратних циклів.

Префікси повторення в мові Асемблера задаються тільки явно як окрема машинна інструкція або безпосередньо в полі мнемокоду ланцюгової команди. Мнемоніки префіксів повторення - REP, REPZ (або REPE) REPNZ (або REPNE). Префікс REP задається перед ланцюговими командами, які не виконують порівняння. Алгоритм префікса REP наступний

  1.  Якщо CX=0 (або ECX=0), то вийти з циклу
  2.  Виконати наступну ланцюгову команду
  3.  Виконають декремент регістра CX (ECX) і перейти до п.а)

Префікси REPZ (або REPE) REPNZ (або REPNE) задаються перед ланцюговими командами, які виконують порівняння. Алгоритм їхньої роботи наступний

  1.  Якщо CX=0 (або ECX=0), то вийти з циклу
  2.  Виконати наступну ланцюгову команду
  3.  Виконають декремент регістра CX (ECX)
  4.  Якщо zf=1 для REPZ (REPE) або zf=0 REPNZ (REPNE), то перейти до п.а)

  1.  Особливості трансляції ланцюгових команд на прикладі команд movs.

При трансляції команд  movsw та movsd Асемблер генерує префікс заміни розрядності даних (код 66h), якщо розрядність даних по замовчуванню не відповідає мнемокоду команди. Розрядність адрес для команд movsb, movsw та movsd (відповідно використання регістра SI та DI чи ESI та EDI) встановлюється тільки по замовчуванню. При трансляції команди movs Асемблер може згенерувати префікс заміни розрядності даних, префікс заміни розрядності адрес і один із префіксів заміни сегменту.  Нехай по замовчуванню встановлені 16-розрядні дані та адреси (атрибут USE16 в директиві SEGMENT), тоді в результаті трансляції машинної інструкції

movs  dword ptr [edi],gs:dword ptr [esi]

Асемблер згенерує 4 байта:

67h| 66h| 65h: 0A5h, де 67h – префікс заміни розрядності адрес, 66h - префікс заміни розрядності даних, 65h - – префікс заміни сегменту, 0A7h – код команди movsw.  Таким чином, поле операндів в машинній інструкції movs фактично використовується для генерування префіксів та уточнення коду операції.

ЗАУВАЖЕННЯ В реальному режимі при використанні регістра EDI старші 16 розрядів 32-розрядного зміщення обнуляються.

  1.  Приклад застосування:

Команду movs (movsb, movsw, movsd) застосовують для пересилання рядків (послідовностей, ланцюжків, масивів) у пам'яті. Для цього необхідно використовувати префікс rep. Префікс rep змушує циклічно виконувати команди пересилання доти, поки вміст регістра ecx/cx не стане рівним нулю. При накладанні рядків приймача та джерела необхідно визначати порядок пересилання – з початку чи з кінця рядка.

str1  db 'str1 копіюється в str2'

len_str1=$-str1

a_str1 dd str1

str2  db len_str1 dup (' ')

a_str2 dd str2

mov  cx,len_str1

lds  sі,str1

les  dі,str2

cld

rep  movsb

  1.  Варіанти завдань.
    1.  Прості завдання

Варіант 1.

Задано логічний сегмент

Data1 segment

I1 db ?

I2 db ?

I3 db ?

A1 dw 5 dup (6 dup (0fh,4 dup (0)))

Data1 ends

  1.  Створити сегмент кодів (наприклад, з ім’ям Code1), в якому б програма реалізувала наступне завдання - всі слова трьохвимірного масиву А1, які містять значення 0fh, замінить на суму наступних (по зміщенню в сегменті) 5-х слів шляхом використання індексів, значення яких містяться в байтах за адресами I1,I2,I3
  2.  Створити ще один логічний сегмент даних (наприклад, з ім’ям Data2), в якому  задати директиву A2 dw 5 dup (6 dup (0fh,4 dup (0)))
  3.  Створити ще один логічний сегмент кодів (наприклад з ім’ям Code2), в якому завдання п. 1 виконувалось шляхом використання ланцюгових команд для пошуку значення 0fh. Після підрахунку порівняти значення в масивах A1 та A2. Забезпечить безумовну передачу управління із сегменту Code1 в сегмент Code2 за допомогою непрямої міжсегментної передачі управління.

Варіант 2.

Задано логічний сегмент

Data1 segment

I1 db ?

I2 db ?

I3 db ?

A1 dw 6 dup (8 dup (7 dup (0)))

Data1 ends

  1.  Створити сегмент кодів (наприклад, з ім’ям Code1), в якому б програма реалізувала наступне завдання – в кожний елемент масиву записати добуток індексів, значення яких містяться в байтах за адресами I1,I2,I3
  2.  Створити ще один логічний сегмент даних (наприклад, з ім’ям Data2), в якому задати директиву A2 dw 6 dup (8 dup (7 dup (0)))
  3.  Створити ще один логічний сегмент кодів (наприклад, з ім’ям Code2), у якому шляхом використання ланцюгових команд знайти всі слова масиву А1, значення яких дорівнює 36, а адреси (зміщення в сегменті) цих слів записати в елементи масиву А2 із тими самими індексами. Забезпечить безумовну передачу управління із сегменту Code1 в сегмент Code2 за допомогою непрямої міжсегментної передачі управління.

Варіант 3.

Задано шаблон структури

Tabl1  struc

namex  db 8 dup (?)

field2  dw ?

Tabl1  ENDS

Задано логічний сегмент

Data1 segment

I1 db 0

A1 Tabl1 6 dup (<>)

Data1 ends

  1.  Створити сегмент кодів (наприклад, з ім’ям Code1), в якому б програма реалізувала наступне завдання – в кожне поле field2 структур із масиву структур А1 записати зміщення в сегменті поля namex структури з тим же самим індексом в масиві. Початкове значення індексу міститься в байті за адресою I1.
  2.  Створити ще один логічний сегмент даних (наприклад, з ім’ям Data2), в якому задати директиву A2 Tabl1 12 dup (<>)
  3.  Створити ще один логічний сегмент кодів (наприклад, з ім’ям Code2), в якому шляхом використання ланцюгових команд переписати весь масив структур А1 в масив структур А2, починаючи з 3-ої структури. Забезпечить безумовну передачу управління із сегменту Code1 в сегмент Code2 за допомогою непрямої міжсегментної передачі управління.

Варіант 4.

Задано шаблон структури

Tabl1  struc

namex  db 8 dup (10h)

field1  db ?

field2  dw ?

field8  dq ?

Tabl1  ENDS

Задано логічний сегмент

Data1 segment

I1 db 1

A1 Tabl1 6 dup (<>)

Data1 ends

  1.  Створити сегмент кодів (наприклад, з ім’ям Code1), в якому б програма реалізувала наступне завдання – в кожне поле field2 структур із масиву структур А1 записати суму байтів поля namex цієї ж структури плюс індекс структури в масиві (індекси змінюються від 0 до 5). Значення індексу зберігається в байті за адресою I1.
  2.  Створити ще один логічний сегмент даних (наприклад, з ім’ям Data2), в якому задати директиву A2 Tabl1 6 dup (<>)
  3.  Створити ще один логічний сегмент кодів (наприклад, з ім’ям Code2), в якому шляхом використання ланцюгових команд переписати 8 байтів кожного поля namex масиву структур А1 в поле field8 масиву А2 із тим самим індексом. Забезпечить безумовну передачу управління із сегменту Code1 в сегмент Code2 за допомогою непрямої міжсегментної передачі управління.

Варіант 5.

Задано шаблон структури

Tabl1  struc

namex  db 4 dup (?)

field1  dw 4 dup (?)

Tabl1  ENDS

Задано логічний сегмент

Data1 segment

I_struc  db ?

I_namex  db ?

A1 Tabl1 6 dup (<>)

Data1 ends

  1.  Створити сегмент кодів (наприклад, з ім’ям Code1), в якому б програма реалізувала наступне завдання – в кожний елемент масиву із поля field1 (по індексу I_namex) структури із масиву структур А1 (по індексу I_struc) записати зміщення в сегменті елементу масиву із поля namex (по індексу I_namex) структури з тим же самим індексом в масиві структур.
  2.  Створити ще один логічний сегмент даних (наприклад, з ім’ям Data2), в якому задати директиву A2 Tabl1 13 dup (<>)
  3.  Створити ще один логічний сегмент кодів (наприклад, з ім’ям Code2), в якому шляхом використання ланцюгових команд переписати весь масив структур А1 в масив структур А2, починаючи з 5-ої структури. Забезпечить безумовну передачу управління з сегменту Code1 в сегмент Code2 за допомогою непрямої міжсегментної передачі управління.

Варіант 6.

Задано логічний сегмент

Data1 segment

Sump  dw 0

sumnp dw 0

A1 dw 6 dup (8 dup (7 dup (102h)))

Data1 ends

  1.  Створити сегмент кодів (наприклад, з ім’ям Code1), в якому б програма реалізувала наступне завдання – накопичити в слові по адресі sump суму байтів масиву А1, які мають парне значення зміщення в сегменті, а в по адресі sumnp - непарні значення зміщення в сегменті.
  2.  Створити ще один логічний сегмент даних (наприклад, з ім’ям Data2), в якому задати директиви

A2 dw 3 dup (8 dup (2 dup (0)))

A3 dw 2 dup (4 dup (4 dup (0)))

  1.  Створити ще один логічний сегмент кодів (наприклад, з ім’ям Code2), в якому шляхом використання ланцюгових команд заповнить масив А2 значенням суми із Sump, а в масив А3 - із sumnp. Забезпечить безумовну передачу управління з сегменту Code1 в сегмент Code2 за допомогою непрямої міжсегментної передачі управління.

Варіант 7.

Задано логічний сегмент Data1

Data1 segment

I1  db 0

I2  db 0

I3  db 0

I4  db 0

A1 dw 5 dup (6 dup (6 dup (5 dup (?))))

Data1 ends

Задано логічний сегмент Data2

Data2 segment

A2 dd 5 dup (6 dup (6 dup (5 dup (0abcd0123h))))

Data2 ends

  1.  Створити сегмент кодів (наприклад, з ім’ям Code1), в якому б програма реалізувала наступне завдання – пересилання двох "середніх" байтів (0CD01H) кожного чотирьохбайтного елемену масиву A2 в відповідний (тобто, з тими самими значеннями індексів) елемент масиву A1, використовуючи значення індексів масивів по адресах І1,І2,І3,І4.
  2.  Створити ще один логічний сегмент кодів (наприклад, з ім’ям Code2), в якому з використанням ланцюгових команд підраховувалась кількість байт логічного сегменту Data2, значення яких дорівнює 0abh. Забезпечить безумовну передачу управління з сегменту Code1 в сегмент Code2 за допомогою непрямої міжсегментної передачі управління.

Варіант 8.

Задано логічний сегмент Data1

Data1 segment

I1  db 0

I2  db 0

I3  db 0

I4  db 0

A1 dw 2 dup (6 dup (7 dup (5 dup (?))))

Data1 ends

Задано логічний сегмент Data2

Data2 segment

A2 dd 2 dup (6 dup (7 dup (5 dup (?))))

Data2 ends

  1.  Створити сегмент кодів (наприклад, з ім’ям Code1), в якому б програма реалізувала наступне завдання – завантаження логічної адреси кожного елементу масиву А1 в відповідний (тобто, з тими самими значеннями індексів) елемент масиву A2. Для значення індексів використовувати байти по адресах І1,І2,І3,І4.
  2.  Створити ще один логічний сегмент кодів (наприклад, з ім’ям Code2), в якому з використанням ланцюгових команд завантажити у всі елементи масиву А1 зміщення в сегменті елементу А2[0,1,2,3] масиву А2. Забезпечить безумовну передачу управління з сегменту Code1 в сегмент Code2 за допомогою непрямої міжсегментної передачі управління.

Варіант 9.

Задано логічний сегмент

Data1 segment

I1 db ?

I2 db ?

I3 db ?

A1 dw 5 dup (8 dup (2 dup (0)))

Data1 ends

  1.  Створити сегмент кодів (наприклад, з ім’ям Code1), в якому б програма реалізувала наступне завдання – якщо всі індекси за адресами I1,I2,I3 парні, то в елемент масиву А1[i1,i2,i3] записується зміщення в сегменті цього елементу, а якщо хоча б один з індексів не парний, то в елемент масиву А1[i1,i2,i3] записується сегментна частина логічної адреси цього елементу.
  2.  Створити ще один логічний сегмент даних (наприклад, з ім’ям Data2), в якому задати директиву A2 dw 5 dup (8 dup (2 dup (0)))
  3.  Створити ще один логічний сегмент кодів (наприклад, з ім’ям Code2), в якому шляхом використання ланцюгових команд переписати масив А1 в А2 та підрахувати в масиві А2 кількість елементів, які містять сегментні частини логічних адрес. Забезпечить безумовну передачу управління з сегменту Code1 в сегмент Code2 за допомогою непрямої міжсегментної передачі управління.

Варіант 10.

Задано шаблон структури

Node  struc

namex  db 5 dup (?)

field1  dw 5 dup (?)

Node  ENDS

Задано логічний сегмент

Data1 segment

I_struc  db ?

I_namex  db ?

A1 Node 6 dup (<>)

Data1 ends

  1.  Створити сегмент кодів (наприклад, з ім’ям Code1), в якому б програма реалізувала наступне завдання – в елементи масиву  із поля field1 (по індексу I_namex) структури із масиву структур А1 (по індексу I_struc) записати зміщення в сегменті інших структур із масиву структур А1 (формування повного орієнтованого графа, в якому вершини - це поля namex, а дуги - елементи масиву поля field1). Для доступу до слів масиву в полі field1 використовувати індекс по адресі I_namex. Для доступу до структур в масиві А1 використовувати індекс по адресі I_struc.
  2.  Створити ще один логічний сегмент даних (наприклад, з ім’ям Data2), в якому задати наступну директиву

Db  'node1','node2', ,'node3','node4','node5','node6'

  1.  Створити ще один логічний сегмент кодів (наприклад, з ім’ям Code2), в якому шляхом використання ланцюгових команд переписати імена вершин графа в поля namex структур масиву структур А1. Забезпечить безумовну передачу управління з сегменту Code1 в сегмент Code2 за допомогою непрямої міжсегментної передачі управління.

Варіант 11.

Задано шаблон структури

Node  struc

namex  db 4 dup (0ffh)

field1  dw 2 dup (0)

Node  ENDS

Задано логічний сегмент

Data1 segment

I_struc  db ?

A0 Node  <>

A1 Node 2 dup (<>)

A2 Node 4 dup (<>)

A3 Node 8 dup (<>)

Data1 ends

  1.  Створити сегмент кодів (наприклад, з ім’ям Code1), в якому б програма реалізувала наступне завдання – створити дерево, де в 2-х елементний масив поля field1 структури A0 записуються зміщення в сегменті 2-х структур із масиву структур A1. В 2-х елементний масив поля field1 структури A1[0] заносяться зміщення в сегменті структур A2[0] та A2[1] і т.д. При створенні програми для індексації масивів структур використовувати байт по адресі I_struc.
  2.  Створити ще один логічний сегмент даних (наприклад, з ім’ям Data2), в якому задать наступні директиви

B0 Node  <>

B1 Node 2 dup (<>)

B2 Node 4 dup (<>)

B3 Node 8 dup (<>)

  1.  Створити ще один логічний сегмент кодів (наприклад, з ім’ям Code2), в якому шляхом використання ланцюгових команд переписати масиви структур A0-A4 в масиви структур B0-B4 та відкоригувати значення полів field1 так, щоб масиви структур B0-B4 також репрезентували дерево. Забезпечить безумовну передачу управління з сегменту Code1 в сегмент Code2 за допомогою непрямої міжсегментної передачі управління.

Варіант 12.

Задано шаблон структури

Node  struc

namex  db 4 dup (?)

dst  dw ?

Node  ENDS

Задано логічний сегмент

Data1 segment

I_struc db  ?

Order  db  0,4,2,1,3

A1   Node  5 dup (<>)

Data1 ends

  1.  Створити сегмент кодів (наприклад, з ім’ям Code1), в якому б програма реалізувала наступне завдання – на базі масиву структур А1 створити кільцевий список, де в поле dst структури А1[0] записується зміщення в сегменті структури А1[4], в поле dst структури А1[4] записується зміщення в сегменті структури А1[2] і т.д. згідно з порядком, який заданий в масиві Order. В поле dst структури А1[3] записується зміщення в сегменті структури А1[0]. При створенні програми для індексації масивів структур використовувати байт по адресі I_struc.
  2.  Створити ще один логічний сегмент даних (наприклад, з ім’ям Data2), в якому задати наступну директиву

A2   Node  5 dup (<>)

  1.  Створити ще один логічний сегмент кодів (наприклад, з ім’ям Code2), в якому шляхом використання ланцюгових команд переписати масив А1 в масив А2, та відкоригувати значення полів dst, щоб масив А2 також являв собою кільцевий список. Забезпечить безумовну передачу управління з сегменту Code1 в сегмент Code2 за допомогою непрямої міжсегментної передачі управління.

Варіант 13.

Задано шаблон структури

Node  struc

namex  db 5 dup (?)

field1  dw  0

Node  ENDS

Задано логічний сегмент

Data1 segment

I_struc  db ?

A0 Node  <>

A1 Node 2 dup (<>)

A2 Node 4 dup (<>)

A3 Node 8 dup (<>)

Data1 ends

  1.  Створити сегмент кодів (наприклад, з ім’ям Code1), в якому б програма реалізувала наступне завдання – створити дерево, де в поля field1 структур A3[0] та A3[1] записуються зміщення в сегменті структури A2[0], в поля field1 структур A3[2] та A3[3] записуються зміщення в сегменті структури A2[1] і т.д., в поля field1 структур A3[6] та A3[7] записуються зміщення в сегменті структури A2[3]. Аналогічно заповнюються поля field1 в структурах із масивів А2 та А1. При створенні програми для індексації масивів структур використовувати байт по адресі I_struc.
  2.  Створити ще один логічний сегмент даних (наприклад, з ім’ям Data2), в якому задати наступні директиви

Db  'node0','node10', ,'node11,'node20','node21','node22', 'node23'

Db  'node30','node31','node32', 'node33','node34','node35','node36', 'node37'

  1.  Створити ще один логічний сегмент кодів (наприклад, з ім’ям Code2), в якому шляхом використання ланцюгових команд переписати імена вершин дерева в поля namex структур, які формують дерево (структура А0, масиви структур А1-А3). Забезпечить безумовну передачу управління з сегменту Code1 в сегмент Code2 за допомогою непрямої міжсегментної передачі управління.

Варіант 14.

Задано шаблон структури

Node  struc

namex  db ‘парне’

field1  dw ?

Node  ENDS

Задано логічний сегмент

Data1 segment

I1  db ?

I2  db ?

A1 Node 6 dup (4 dup<>)

Data1 ends

  1.  Створити сегмент кодів (наприклад, з ім’ям Code1), в якому б програма реалізувала наступне завдання – в поле field1  структури із масиву структур А1 записати зміщення в сегменті наступної структури із масиву структур А1. Для доступу до структур в масиві А1 використовувати індекси по адресах I1 та I2. Наступною структурою для структури А1[5,3] вважати структуру А1[0,0]. Якщо значення в полі field1 виявилось не парним, то в поле namex записати ‘непар’
  2.  Створити ще один логічний сегмент даних (наприклад, з ім’ям Data2), в якому задати наступну директиву

A2  Dw  24 dup (?)

  1.  Створити ще один логічний сегмент кодів (наприклад, з ім’ям Code2), в якому з використання ланцюгових команд послідовно переписати в масив А2 всі парні значення полів fild1 масиву структур А1. Забезпечить безумовну передачу управління з сегменту Code1 в сегмент Code2 за допомогою непрямої міжсегментної передачі управління.

Варіант 15.

Задано логічний сегмент Data1

Data1 segment

I1  db 0

I2  db 0

I3  db 0

I4  db 0

A1 db 3 dup (2 dup (7 dup (5 dup (?))))

Data1 ends

Задано логічний сегмент Data2

Data2 segment

II1  db 0

II2  db 0

II3 db 0

A2 db 7 dup (5 dup (2 dup (?)))

Data2 ends

  1.  Створити сегмент кодів (наприклад, з ім’ям Code1), в якому б програма реалізувала наступне завдання – занести в кожний елемент масиву А1 значення його зміщення відносно початку масиву, а потім переслати, використовуючи значення індексів масивів по адресах І1,І2,І3,І4 та ІI1,ІI2,IІ3, 17 елементів масиву А1 починаючи з елементу А1[1,0,3,2] в масив А2, починаючи з елементу А2[3,4,0].
  2.  Створити ще один логічний сегмент кодів (наприклад, з ім’ям Code2), в якому з використанням ланцюгових команд виконати пересилання вказаних елементів масиву А1 в масив А2, починаючи з елементу А2[0,3,1]. Забезпечить безумовну передачу управління з сегменту Code1 в сегмент Code2 за допомогою непрямої міжсегментної передачі управління.

Варіант 16.

Задано логічний сегмент Data1

Data1 segment

I1  db 0

I2  db 0

I3  db 0

I4  db 0

A1 dw 4 dup (7 dup (5 dup (2 dup (4567h))))

Data1 ends

Задано логічний сегмент Data2

Data2 segment

A2 dd 4 dup (7 dup (5 dup (2 dup (23456789h))))

Data2 ends

  1.  Створити сегмент кодів (наприклад, з ім’ям Code1), в якому б програма реалізувала наступне завдання – пересилання слова 4567h кожного елемену масиву A1 в старше слово відповідного елементу масиву A2, використовуючи значення індексів масивів по адресах І1,І2,І3,І4.
  2.  Створити ще один логічний сегмент кодів (наприклад, з ім’ям Code2), в якому з використанням ланцюгових команд підраховувалась кількість байт логічного сегменту Data2, значення яких дорівнює 67h. Забезпечить безумовну передачу управління з сегменту Code1 в сегмент Code2 за допомогою непрямої міжсегментної передачі управління.

Варіант 17.

Задано логічний сегмент

Data1 segment

I1 db ?

I2 db ?

I3 db ?

A1 dw 6 dup (8 dup (7 dup (0)))

Data1 ends

  1.  Створити сегмент кодів (наприклад, з ім’ям Code1), в якому б програма реалізувала наступне завдання – в кожний елемент масиву записати суму індексів, значення яких містяться в байтах за адресами I1,I2,I3
  2.  Створити ще один логічний сегмент даних (наприклад, з ім’ям Data2), в якому задати директиву A2 dd 6 dup (8 dup (7 dup (0)))
  3.  Створити ще один логічний сегмент кодів (наприклад, з ім’ям Code2), в якому шляхом використання ланцюгових команд знайти всі слова масиву А1, значення яких дорівнює 5, а логічні адреси цих слів записати в елементи масиву А2 з тими самими індексами. Забезпечить безумовну передачу управління з сегменту Code1 в сегмент Code2.

Варіант 18.

Задано логічний сегмент

Data1 segment

Sumс4 dw 0

Sumnс4 dw 0

A1 dd 3 dup (5 dup (9 dup (1020201h)))

Data1 ends

  1.  Створити сегмент кодів (наприклад, з ім’ям Code1), в якому б програма реалізувала наступне завдання – накопичити в слові по адресі sumc4 суму байтів масиву А1, в яких значення зміщення в сегменті кратне 4 (ділиться на 4), а в по адресі sumnc4 - не кратне 4 (не ділиться на 4).
  2.  Створити ще один логічний сегмент даних (наприклад, з ім’ям Data2), в якому задати директиви

A2 dw 2 dup (8 dup (4 dup (0)))

A3 dw 4 dup (4 dup (4 dup (0)))

  1.  Створити ще один логічний сегмент кодів (наприклад, з ім’ям Code2), в якому шляхом використання ланцюгових команд заповнить масив А2 значенням суми із sumc4, а в масив А3 - із Sumnс4. Забезпечить безумовну передачу управління з сегменту Code1 в сегмент Code2 за допомогою непрямої міжсегментної передачі управління.

Варіант 19.

Задано логічний сегмент Data1

Data1 segment

I1  db 0

I2  db 0

I3  db 0

I4  db 0

A1 dw 3 dup (4 dup (2 dup (5 dup (?))))

Data1 ends

Задано логічний сегмент Data2

Data2 segment

A2 dd 3 dup (4 dup (2 dup (5dup (?))))

Data2 ends

  1.  Створити сегмент кодів (наприклад, з ім’ям Code1), в якому б програма реалізувала наступне завдання – завантаження зміщення в сегменті старшого слова кожного елементу масиву А2 в відповідний (тобто, з тими самими значеннями індексів) елемент масиву A1. Для значення індексів використовувати байти по адресах І1,І2,І3,І4.
  2.  Створити ще один логічний сегмент кодів (наприклад, з ім’ям Code2), в якому з використанням ланцюгових команд завантажити у всі елементи масиву А2 логічну адресу елементу А1[2,1,1,3] масиву А1. Забезпечить безумовну передачу управління з сегменту Code1 в сегмент Code2 за допомогою непрямої міжсегментної передачі управління.

Варіант 20.

Задано шаблон структури

Tabl1  struc

namex  db 7 dup (?)

field1  db ?

field2  dw ?

field4  dd ?

Tabl1  ENDS

Задано логічний сегмент

Data1 segment

I1 db 0

A1 Tabl1 6 dup (<>)

Data1 ends

  1.  Створити сегмент кодів (наприклад, з ім’ям Code1), в якому б програма реалізувала наступне завдання – в кожне поле field2 структур із масиву структур А1 записати зміщення в сегменті поля field1 структури з тим же самим індексом в масиві. Початкове значення індексу міститься в байті за адресою I1.
  2.  Створити ще один логічний сегмент даних (наприклад, з ім’ям Data2), в якому задати директиву A2 Tabl1 11 dup (<>)
  3.  Створити ще один логічний сегмент кодів (наприклад, з ім’ям Code2), в якому шляхом використання ланцюгових команд переписати весь масив структур А1 в масив структур А2, починаючи з 2-ої структури. Забезпечить безумовну передачу управління з сегменту Code1 в сегмент Code2 за допомогою непрямої міжсегментної передачі управління.

Варіант 21.

Задано логічний сегмент

Data1 segment

I1 db ?

I2 db ?

I3 db ?

A1 dw 4 dup (5 dup (6 dup (0)))

Data1 ends

  1.  Створити сегмент кодів (наприклад, з ім’ям Code1), в якому б програма реалізувала наступне завдання – якщо сума індексів за адресами I1,I2,I3 парна, то в елемент масиву А1[i1,i2,i3] записується сегментна частина логічної адреси цього елементу, а якщо хоча б один з індексів не парний, то в елемент масиву А1[i1,i2,i3] записується зміщення в сегменті цього елементу.
  2.  Створити ще один логічний сегмент даних (наприклад, з ім’ям Data2), в якому задати директиву A2 dw 4 dup (5 dup (6 dup (0)))
  3.  Створити ще один логічний сегмент кодів (наприклад, з ім’ям Code2), в якому шляхом використання ланцюгових команд переписати масив А1 в А2 та підрахувати в масиві А2 кількість елементів, які не містять сегментні частини логічних адрес. Забезпечить безумовну передачу управління з сегменту Code1 в сегмент Code2 за допомогою непрямої міжсегментної передачі управління.

Варіант 22.

Задано шаблон структури

Tabl1  struc

namex  db 5 dup (1h)

field1  db ?

field2  dw ?

field8  db ‘not error’

Tabl1  ENDS

Задано логічний сегмент

Data1 segment

I1 db 1

A1 Tabl1 6 dup (<>)

Data1 ends

  1.  Створити сегмент кодів (наприклад, з ім’ям Code1), в якому б програма реалізувала наступне завдання – в кожне поле field2 структур із масиву структур А1 записати суму байтів поля namex плюс зміщення в сегменті поля field1. Значення індексу масиву структур зберігається в байті за адресою I1 та змінюється від 0 до 5.
  2.  Створити ще один логічний сегмент даних (наприклад, з ім’ям Data2), в якому задати директиву A2 Tabl1 6 dup (<>)
  3.  Створити ще один логічний сегмент кодів (наприклад, з ім’ям Code2), в якому шляхом використання ланцюгових команд переписати старші 6 байтів кожного поля field8 масиву структур А1 в поле field8 масиву А2 із тим самим індексом. Забезпечить безумовну передачу управління з сегменту Code1 в сегмент Code2 за допомогою непрямої міжсегментної передачі управління.

Варіант 23.

Задано логічний сегмент

Data1 segment

I1 db ?

I2 db ?

I3 db ?

A1 dd 4 dup (7 dup (3 dup (0),1234h))

Data1 ends

  1.  Створити сегмент кодів (наприклад, з ім’ям Code1), в якому б програма реалізувала наступне завдання - усі слова трьохвимірного масиву А1, які містять значення 1234h, замінить на суму наступних по зміщенню в сегменті 4-х слів шляхом використання індексів, значення яких містяться в байтах за адресами I1,I2,I3
  2.  Створити ще один логічний сегмент даних (наприклад, з ім’ям Data2), в якому задати директиву A2 dd 4 dup (7 dup (4 dup (0)))
  3.  Створити ще один логічний сегмент кодів (наприклад, з ім’ям Code2), в якому завдання п.1 виконувалось шляхом використання ланцюгових команд для пошуку значення 1234h. Після підрахунку порівняти значення в масивах A1 та A2. Забезпечить безумовну передачу управління із сегменту Code1 в сегмент Code2 з використанням непрямої адресації.

Варіант 24.

Задано шаблон структури

Node  struc

namex  db 5 dup (?)

left  dw ?

right  dw ?

Node  ENDS

Задано логічний сегмент

Data1 segment

I_struc db  ?

I_order db  ?

Order  db  0,3,1,2,4

A1   Node  5 dup (<>)

Data1 ends

  1.  Створити сегмент кодів (наприклад, з ім’ям Code1), в якому б програма реалізувала наступне завдання – на базі масиву структур А1 створити кільцевий двонаправлений список, де в поле left структури А1[0] записується зміщення в сегменті структури А1[4], а в поле right структури А1[0] записується зміщення в сегменті структури А1[3]; в поле left структури А1[3] записується зміщення в сегменті структури А1[0], а в поле right структури А1[3] записується зміщення в сегменті структури А1[1], і т.д. згідно з порядком, який заданий в масиві Order. При створенні програми для індексації масивів структур використовувати байт по адресі I_struc, а для доступу до елементів масиву Order використовувати байт по адресі I_order.
  2.  Створити ще один логічний сегмент даних (наприклад, з ім’ям Data2), в якому задати наступну директиву

Db  'Null ','One  ','Two  ',Three','Four ''

  1.  Створити ще один логічний сегмент кодів (наприклад, з ім’ям Code2), в якому шляхом використання ланцюгових команд переписати імена елементів списку в поля namex структур, які формують список. Забезпечить безумовну передачу управління з сегменту Code1 в сегмент Code2 за допомогою непрямої міжсегментної передачі управління.

Варіант 25.

Задано логічний сегмент

Data1 segment

I1 db ?

I2 db ?

I3 db ?

I4 db ?

A1 dd 6 dup (5 dup (4 dup (3 dup (?))))

Data1 ends

  1.  Створити сегмент кодів (наприклад, з ім’ям Code1), в якому б програма реалізувала наступне завдання - записати у всі елементи масиву A1 значення індексів по правилу

А1[I1,I2,I3,I4]:= (I1 shl 24) or (I2 shl 16) or (i3 shl 8) or I4;

Вважається, що індекс по адресі I1 змінюється від 0 до 2, по адресі I2 - від 0 до 3 і т.д.

  1.  Створити ще один логічний сегмент даних (наприклад, з ім’ям Data2), в якому  задати директиву A2 dd 180 dup (0)
  2.  Створити ще один логічний сегмент кодів (наприклад, з ім’ям Code2), в якому  за допомогою ланцюгових команд знайти та послідовно переслати в масив А2 всі 4-х байтні елементи масиву А1, які містять хоча б один байт зі значенням 2. Забезпечить безумовну передачу управління з сегменту Code1 в сегмент Code2.

  1.  Ускладнене завдання

Для виконання ускладненого завдання необхідно:

  1.  Створити, налагодити та перевірити працездатність простого завдання згідно варіанту.
    1.  Скопіювати початковий файл простого завдання.
      1.  В копії добавить новий логічний сегмент даних (наприклад, Date3) та новий логічний сегмент кодів (наприклад Code3), в якому б програма реалізувала наступне завдання
  •   скопіювать сегмент даних Date2, а потім Date1 в сегмент Date3
  •  скопіювать сегмент кодів Code2, а потім Code1 в сегмент Code3
  •  Відкоригувати адресні посилання в скопійованих програмах
  •  Виконати просте завдання в спільному сегменті Code3 з використанням спільного сегменту Date3.

  1.  Питання для перевірки.
    1.   Як прочитати в програмі команди програми ?
    2.  Що таке багатокомпонентна адреса і для чого вона використовується ?
    3.  Як зміниться результат трансляції програми (порівняти лістинги), якщо задать наступну директиву ASSUME:

ASSUME CS:CODE,DS: NOTHING,ES:DATA,SS:NOTHING

Перевірити правильність виконання програми та пояснити результат перевірки.

  1.  Як треба змінити програму, щоб вона виконувалась без помилок при наступному операторі ASSUME:

ASSUME CS:CODE,DS: NOTHING,ES:DATA,SS:NOTHING


 

А также другие работы, которые могут Вас заинтересовать

63974. Класифікація і специфіка використання ОЗП. Методи вимірювання опору, ємності, індуктивності, добротності 281.79 KB
  У мостових схемах опори вимірюють, порівнюючи величини вимірюваного опору з величиною зразкового опору шляхом порівняння падіння напруг на цих опорах. При роботі в електричних полях змінного струму у діелектриках виникають втрати потужності.
63975. Индивидуальный подход и особенности его реализации в обучении иностранным языкам 185.35 KB
  Современная образовательная ситуация характеризуется становлением гуманистической парадигмы предполагающей иные отличные от традиционных подходы к организации образовательного процесса основанные на концепции индивидуального подхода целеполаганием которого является обеспечение развития...
63976. ОРГАНИЗАЦИЯ ПРЕДПРИНИМАТЕЛЬСКОЙ ДЕЯТЕЛЬНОСТИ НА УСЛОВИЯХ ФРАНЧАЙЗИНГА 33.98 MB
  Целью дипломной работы является проект по созданию ресторана «KFC» (Kentuсky Fried Chicken) в городе Иркутске с использованием методов экономического анализа, достижение поставленной цели предполагает необходимость решения следующих задач: изучить историю франчайзинга...
63977. Основные направления борьбы с коррупцией в таможенных органах на основе анализа международного опыта 680.5 KB
  Понятие коррупции и история ее возникновения в таможенных органах. Требования по предупреждению коррупционных правонарушений Основные направления по противодействию коррупции. Причины возникновения коррупции модели и индексы. Основные принципы противодействия коррупции.
63979. ДОСЛІДЖЕННЯ МЕХАНІЗМУ УПРАВЛІННЯ ПОТОЧНИМИ ВИТРАТАМИ ТА РОЗРОБЛЕННЯ НАПЯМКІВ ЇХ ЗНИЖЕННЯ НА ПІДПРИЄМСТВІ 1.2 MB
  Об’єкт дослідження поточні витрати та процес управління витратами на ВАТ Шосткінській хлібокомбінат. Сутність і результати роботи в розділі Теоретико-методичні основи визначення поточних витрат та обґрунтування механізму управління ними подано основні теоретичні положення щодо формування поточних витрат...
63981. Электронные государственные услуги в социальной сфере защиты населения г. Москвы 342.3 KB
  Целью дипломной работы является исследование государственных электронных услуг. Объектом исследования дипломной работы является реализация внедрения и предоставления государственных электронных услуг.
63982. ПРАВОВЕ РЕГУЛЮВАННЯ МИТНИХ ФОРМАЛЬНОСТЕЙ В УКРАЇНІ 288.89 KB
  Так митні операції що не впливають на розмір митного тарифу називають ще митними процедурами та формальностями які здійснюють нетарифне регулювання зовнішньої торгівлі. До таких процедур та формальностей відносять: правила прийняття товарів до митного оформлення місце виконання митних формальностей...