Будь умным!


У вас вопросы?
У нас ответы:) SamZan.net

на тему- Програмування на мові Асемблерrdquo;

Работа добавлена на сайт samzan.net:


 

Курсова робота

з мови прграмування „Асемблер”

на тему:Програмування на мові Асемблер”.

 .  
Зміст

Вступ

  1.  Сегментація пам’яті.
  2.  Команди пересилання muv.
  3.  Команди передачі даних.
  4.  Робота з стеком (команди pop і push).
  5.  Арифметичні команди.

                       


Сегментація пам’яті.

Перед тим як вивчати регістри і команди процесора 8086 необхідно зрозуміти,як він адресує пам’ять,використовуючи системні сегменти і зміщення.

Регістр невелика по розміру память спеціального призначення.Використовуючи для представлення значення адреси 20 біт,8086-й процесор може мати доступ до 1 Мбайта памяті.DOS ROMBIOS та інші програми,які знаходяться в памяті ПК вже займають певне місце в памяті,тому решта програм записуються, використовуючи менший простір памяті до 640 кБ.

Незалежно від того,скільки пам’яті може адресувати процесор,найменшим блоком пам’яті є 8-бітовий байт.Кожен байт має своє унікальне місцеположення,яке називається фізичним адресом,по ньому програми можуть читати і записувати інформацію.[Для адресації великих об’ємів пам’яті,потрвбно більша кількість біт під фізичні адреси ].Процесор 8086 використовується тільки 16-бітові регістри.Щоб мати доступ до всього мегабайта пам’яті,використовується метод сегментації пам’яті.

Сегментація пам’яті метод,який використовується процесором 8086 для розділення великого адресного прстору на логічні 64 кБ фрагменти.З допомогою цього методу адрес конкретного байта може бути виражений двома значеннями: за адресом фрагмента сегмента і 16-бітовим зміщенням від початку сегмента.Ця комбінація значень сегмента і зміщення,називається логічною адресою.

Якщо в компютері 64 кБ памяті,тоді для задання адреса будь-якого байта досить 16 біт,з допомогою яких представляються значення від 0 до 65535 (216-1) або заокруглено до 64 кБ.

СП. Тема 1.5:Команди МП 8088/86.

Команди передачі даних.

В залежності від виконуваних функцій всі команди CPU 8086 діляться шість категорій:

Команди передачі даних.

Алгоритмічні команди.

Логічні команди.

Команди управління потоком.

Команди управління процесором.

Команди для роботи з рядками.

1.Команди передачі даних.

Ці команди діляться на чотири частини:загальні, в/в, адресні і прапорів.Операнди справа від імені команди визначають необхідні їй елементи даних.Їх може бути 2,1 або жодного.

Розглянемо основні команди.

2.Команда mov.

Ця команда найчастіше зустрічається в програмах на Аs.Для mov потрібні два операнди:операнд- джерело іоперанд- призначення; джерело записується після призначення:mov призначенн джерело (дані з джерела передаються в направленні стрілки,справа на ліво).

Наприклад: 1) mov ax bx ; axbx

значення регістра bx пересилається в регістр ах.Якщо значення ах= 0000,bx= 0123h, то після виконання mov значення ах стане дорівнювати 0123h, bx не зміниться.

  1.  mov cx, [num Pages]; ax [num Pages].

Пересилає значення, яке знаходиться в [num Pages] в регістер сх.Мітка num Pages визначає адресу в памяті,а [num Pages] відповідає даним записаним по цьому адресу.Тобто мітки визначають адреси,по яких дані зберігаються в памяті:

3) mov [level],dl ; [level] dl

значення з 8- бітового регістра dl пересилаються по адресу,на який вказує мітка.Така пересилка даних копіювання значення одного регістра в другий і переміщення даних з регістра в пам’ять одна з найбільших загальних операцій в програмуванні на Аs.Проте mov не може пересилати дані безпосередньо між двома адресами пам’яті.Тому,запис mov [count], [maxCount] є некоректним,щоб пересилати значення,записане в maxCount по адресу count потрібно виконати два кроки і використати проміжковий регістер:

mov ax,[maxCount]; ax [maxCount]

mov [count],ax ;[Count] ax

Ознайомимся з використанням команди mov на прикладі програми MOV.ASM (практичне заняття).

Робота з стеком (команди pop і push).

Cтекова память.

Стек це спеціальний сегмент памяті,який використовується деякими командами процесора 8086.Положення і розмір стека (до 64 кБт) визначаються програмою і програмістом.Cамий простий засіб створення стека заключається в використанні директиви STACK.Стек виконує три основні функції:

  1.  Тимчасове збереження значень регістрів;
  2.  Збереження адресів повернення з підпрограми;
  3.  Збереження динамічних змінних.

Останній більш характерний при роботі з високорівневими мовами програмування.

Як працює стек.(Принцип роботи стека).

Стек нагадує гору тарілок.Верхню тарілку легко взяти,але щоб добратися до тарілки,яка знаходиться знизу,потрібно зняти всі тарілки над нею.

Розміщення нової порції з вершини на вершину стека називається проштовхуванням в стек (push). 

 Видалення,порції з вершини стека, яке приводить до підняття на один рівень останніх порцій , на 3 виштовхуванням стека (pop) байта в стеку.

При проштовхуванні в стек останьої порції вона перша і виштовхується,тому такий тип стека називається LIFO-стек (LAST- IN- First- Out останній- прийшов- перший- пішов).

На відміну від тарілок,значення в пам’яті ПК фізично не можуть пересуватися вниз або вверх.Тому для моделювання пересування значень в стеку необхідно використовувати регістри,які визначають базовий розмір стека і зміщення вершини стека,тобто місцеположення верхнього значення в стеку.

Сегментний регістр ss містить адресу початку стекового сегмента.В регістрі sp знаходиться зміщення вершини стека відносно цього сегмента.

Стековий сегмент.

0F00:

0000

0002

0004

0006

ss:sp 3

0008

ss:sp 2

000A

ss:sp 1

000C

на рис.4.4 зображено,як розміщується в пам’яті невеликий сегмент із 12 байт.В регістрі ss знаходиться адрес початку стекового сегмента 0F00.Регістр sp вказує на зміщення відносно йієї початкової адреси в інтервалі від 0000 до 000А.Останній байт стека має зміщення 000В.Під елементи стека виділяють 2-байтові слова..

Щоб використовувати цей стек , в програмі досить декларувати STACK 12 , після чого асемблер компановщик DOS самі точно визначать , де розмістити стек в пам яті. Регістри ss i sp не потрібно ініціалізувати , це робить DOS при загрузці ас програми на рисунку 44 .SP1 вказує , куди при запуску програма вказує sp.Потрібно замітити , що логічний адрес ss:sp вка-

зуэ на байт , розміщений нижче останнього ,байта в стеку.

Потрібно пам ятати , що основа стека  розміщується в більш високих адресах пам яті.В пам яті стек росте в напрямі зменшення адрес пам яті і зменшується в протилежному напрямку .

До бажаного результату приведем на рис.4.4 виконання слідуючих команд :

mov           ax ,  100

push  ax                     ; sp 2

 mov           bx ,   200

 push  bx                    ; sp3 

Команда  push виконує дві дії :

  1.  Зменшує на 2 значення sp 
  2.  Задане значення регістра записується по адресу [ ss:sp ]- розуміємо значення з зміщенням sp в середині стекового сегмента .

Порядок цих кроків істтній . Спочатку push віднімає 2 із sp. На рис. 4.4 першиц оператор push

записує sp2  в sp , поміщаючи потім туди значення з регістра ax . Після виконання цих дій вказівник степення адресує останнє поміщення в стек юдюжзначення.

  Управління  стеком

Принцип  правильного  управління стеком  простий :  

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

Інакше , сдідуючі  проштовхування  приведуть  до  все  більшого  росту  стека ,і  можуть  викликати  переповнення  сигмента ,  виділеного  програмою.  Це  призводить  до зависання  системи , тому  що  починають  перекриватись  області  пам яті .

 Якщо  ж  кількість  команд  pop  , більше  числа к. .Push ,може  бути  зникнення  стека, що й  приведе  до  зависання  програми.

  Приклад

 

 push  ax                    ;   занести   ax , bx , dx  в  стек

 push  bx

 push  dx

; -  тут  знаходиться  програма

 pop  dx                   ;   вийняти  dx,  bx ,  ax  із стека.

 pop  bx

 pop  ax

Тут зрозуміло ,що  команди між push i pop будуть використовувати регістри ax. bx i dx;

тому для збереження початкових значень вони проштовхуютья в стек . Потім ці ж регістри у зворотньому порядку виштовхуються із стека  відновлюються початкові значення і підтримуючи стек в правильному стані ( состоянии ).

Перестановка даних ( команда xchg)

 Команда xchg -міняє місцями значення двох регістрів або значення регістра з байтом  або словом  , яке зберігається в пам яті .

Приклад

Нехай , ми хочемо переставити значення в регістрах  dx i ax. Використовуючи xchg , можна  

записати :

 

 xchg        ax , dx           ; ax    dx ;    dx    ax 

( порядок операндів не грає ролі )

Інакше , для перестановки двох 16 - бітових регістрів , можна використати менш ефективний метод який використовує стек як поміжкове місце збереження одного з значень.

 push      ax                 ; стек    ax

 mov      ax,dx             , ax      dx

 pop       dx                 ; dx      ( стек початкове значення ax ).

Приклад  

Для перестановки двох 8 - бітових значень необхідний третій регістр , так як  в стек можна проштовхувати , виштовхувати тільки 16 - бітні слова .

Щоб переставити два байти  в al i ah, не використовучи xchg потрібно записати:

 mov    bh, ah             ; bh     ah

 mov    ah, al              ; ah      al

 mov    al, bh              ; al      bh

При використанні xchg цього не потрібно .

Приклад

Крім перестановки значень регістрв , xchg  також може міняти місцями значення врегістрі

з значенням , яке зберігається :

  1.  xchg      ax,[ things ] ;        ax        [ things ]
  2.  xchg  [ oldCount ],cx ;       cx        [ oldCount ]

Команди для роботи з рядками

Команди для роботи з рядками можуть служити для обробки всіх типів даних, а не тільки символьних рядків. В Асемблері рядки є послідовностями байтів, які можуть або представляти, або не представляти ASCII-символи. Рядкові команди діляться на три групи:

- команди пересилки рядків

- команди перевірки рядків

- команди  префікса повтору.

Команди обробки рядків 8086.

Команди пересилки рядків:

lods джерело               - загрузка рядка байтів або рядка слів

lodsb                           - загрузка рядка байтів

lodsw                           - загрузка рядка слів

movs призи, джерело - пересилка рядка байтів або рядка слів            

movsb                         - пересилка рядка байтів

movsw                        - пересилка рядка слів

stos призначення        - запис рядка байтів або рядка слів

stosb                            - запис байта в рядок

stosw                           - запис слова в рядок

Команди перевірки рядків.

cmps призначення, джерело  - порівняння рядків по байтах або словах

cmpsb                                      - пересилка рядків по байтах

cmpsw                                     - пересилка рядків по словах

scas призначення                    - пошук байта або слова в рядку

scasb                                        - пошук байта в рядку

scasw                                       - пошук слова в рядку

Команди префікса повторень

rep                                          - повторення

repe/repz                                 - повторення, поки =0

repne/repnz                             - повторення, поки не =0

Команди перевірення рядків пересилають байти або слова з пам’яті в регістр, з регістра в пам’ять або безпосередньо з пам’яті в пам’ять.

Команди перевірки рядків дозволяють порівнювати або знаходити байти або слова.

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

Насправді існує 5 рядкових команд: (хоч мнемонічних назв значно більше).bods, stos, movs, scas, cmps. Решта назв не вимагають оперантів, тому більш прості для використання.

Аналогічно, існує 2 префіксса повтору: команда rep ідентична командам repe i repz. Команди repne i rehnz також представляють одинаковий префікс.

2.Рядкові індексні регістри.

Рядкові команди працюють завжди з одними і тими же комбінаціями регістрів - dsisi i csidi - з індексними регістрами рядка-джерела і рядка призначення, які визнаяають зміщення в даних і сегментах.

АРЕФМЕТИЧНІ  КОМАНДИ

                            

Математичні  команди  в  мові  Ас.  обмежуються  додаванням,  множенням,  діленням, і  відніманням  знакових   і  безнакових    цілих  двійкових   чисел.

КОМАНДИ   ДОДАВАННЯ.

Є    5  команд   додавання   

add  i  adc  сумують   два  байта  або  слова .

inc (інкремент)  -  команда  швидкого  додавання  1  до  регістра або  значення  в  памяті.

aaa  i  daa  виконують  корекцію   значень   представлених

в  двійковому  -10  форматі    

  1.  Щоб  додати  8- бітове  значення  в  ah  з  8-бітового  значення  в  ah  можна  записати:

      add   ah, bh         ;   ah  ah+bh

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

задане  місце,  замінюючи  початкове  значення.

  1.  Команда  adc  працює  акалогічно,   але  додає   до  результату  прапор  переносу cf:

    adc  ah, bh        ; ah    ah+bh+cf

Якщо  cf=1  то  результат  одержуємо  такий  же,  як  при  додаванні  1  до  суми  ah  i  bh.  Прапор  cf  встановлюється   в 1,  якщо  в  попередньому  додаванні   виникло  переповнення . Тому  adc  частіше виконується  після  add,  яке  додає  багатобайтові  значення,  повідомляючи  про  переноси ,  які  виникають  при  додаванні  окремих  байтів.

  1.  Для  сумування  в  регістрі  ах  окремих  байтів  16-бітового  значення  записуємо  по  адресу  sum, можна  використовувати   слідуючі  команди  які  подвоюють  слово  sum:

mov  ax, [wordsum]     ;переслати в  ax  знач.[sum]

add   al,   [byte  snm]    ;додати  молодший   байт

adc   ah    [byte   sum+1]    ; додати  старший  байт  з   мож-

                                            ливим   переносом

mov          [wordsum]  ,  ax  ;переслати  одержане  значення

                                           назад  в  память

Памятаєм,  що   в  слові  байти  зберігаються  в  зворотньому  порядку  1.к. загружає  значення  слова  в  ах;

2.к.задає  один  з  другим   молодші  значущі  байти,  записуючи  в  al,  і  вип.переп.  виснаження  переносу  встановлює   cf  в1;  3.к.  додає  цей  можливий  перенос  до  суми  старших  знач.байтів.4.к.записує  кінцевий  результат  назад  в  память

  Оскільки  8086  може  безпосередьо працювати  з  словами  ,то  ці ж  дії  можна  виконати  двома  командами:

     mov    ax,   [word sum]    ;переслати  в  ах  значення 

                                               [sum]

     add   [word sum] ,ax         ;  додати  [sum]  до  самого  

                                                  себе

add  не  може  додавати  два  значення ,  записані   в  памяті  ,  тому  потрібно  визначити  хоч  один   регістр

в який  і  заслати  [sum].

    В  цих  випадках  оператори  byte  i  word  інформують  асемблер  про  тип  даних, які  адресує[sum].  В  деяких

випадках  їх  можна  не  використовувати,  проте  вони  не  зашкодять.

  1.  add  i  adc  можуть  додавати  до  регістра  і  значення  в  памяті  безпосередні  (літеральні)  значення:

      add      bx,5          ;bx   bx+5

  1.  Щоб  швидше  додати  1  до  деякого  значення  замість  add   використаємо  inc,  яка  вимагає  лише  одного  операнда.

    inc    ax        ;    axax+1              

    inc    bx        ;    bxbx+1

    inc    cx         ;    cxcx+1

    inc    dx         ;    dx dx+1

   Ці  команди  збільшують  на  1  значення  4-х  регістрів  загального  призначення  (16-бітові)

Можна  на 1  збльшити  8-бітовий  регістр:

     inc      dh       ;   dhdh+1

КОМАНДИ    ВІДНІМАННЯ

 По  своїй  формі  віднімання  в  Ас.схоже  з  додаванням         

Команда  sum   віднімає  значення   байтів   або  слів.

Команда  sbb  діє  аналогічно,  проте  враховує  можливу

помилку  при  попередньому  відніманні  багатобайтових

значень.

  1.  sub   ax  ,  bx       axax-bx
  2.  Можна  віднімати  два  регістри  також  можна   віднімати  безпосередні  значення:

sub    cx,5                  ;cxcx-5

sub    dx,[score]         ; dxdx-[score]

sub     [answer],3        ;[answer][answer]-3

sub   ax,1                   ; axax-1

  1.  Останню  команду  можна  замінити  командою  dec,

яка  віднімає  1  з  регістра  або  значення  в  памяті  

  На  1  можна  зменшити  також  значення  представлені  байтом  або  словом.

dec     ax      ;axax-1

dec     dl        ;dldl-1

dec    si          ;sisi-1

ДИВНІ  ВІДНІМАННЯ

Чому   команди  Neg (змінює  знак  двійкового  значення)  і  Cmp (порівнює  дві   величини)  стоять  разом  з  командами    віднімання ?

  1.  В  випадку  з  neg  CPU  8086  віднімає  відповідні     значення  з  0.Це  значення  може  бути  записане  в  регістрі  або   памяті.  При  відніманні  значень  з  0  одержується  значення  в  додатковому   коді ,  або  інакше двійкове  доповнення  цього  значення,  що

  еквівалентне  заміні  всіх  0  на  1,   а 1на  0  додаємо  1   Простіше  скористатися  командою  neg:

  neg     ax         ; одержання  двійкового  доповнення ах

  neg    [value]    ;одер.  Двійкового  доповнення  [value]

  1.  Більшість  процесорів  цифрових  виконують  порівняння  шляхом  віднімання  одного  значення   з  другого,  а   потім порівнюють  результат.  При  цьому  встановлюють  біти  різних  прапорів  описуючи  тим  самим  результат  наприклад,  є  він  0,  відємним  або  додатнім.  Cmp  виконує  віднімання  аналогічно  ком.  Sub,  проте  зберігає  при  цьому  тільки  значення  прапорів,  які  можуть  перевірятись  іншими  командами,

МНОЖЕННЯ  І  ДІЛЕННЯ БЕЗНАКОВИХ  ЗНАЧЕНЬ.

МНОЖЕННЯ  І   ДІЛЕННЯ  ЗНАКОВИХ  ЗНАЧЕНЬ.

Для  правильного  виконання  множення  і  ділення   вимагається  бути   уважним. Потрібно  слідкувати  за  тим,  щоб  помістити  значення  в  потрібні регістри. Після  виконання  операції  потрібно  уважно  одержувати результат.

    За  роботою  команд  mul,  imul,  div,  i  idiv  прослідкуємо  на  прикладі  програми  MULTDIV.ASM

     Команди  знакового  множення (imul) і  ділення  (idiv)

працюють  аналогічно  mul  div  і  використають  ті  ж  регістри.(Буква  «i»  в  символічному  імені використовується  для  цілих  чисел,  показуючи, що  допускаються  як  додатні  так  і  від’ємні  значення)

Різні  допустимі  діапазони  значень.

Знаковий  байт змінюється  від  -128  до   +127

Знакове  слово  змінюється        -32768  до  32767

 в  програмі,  в  якій  використовується  imul  i   idiv  потрібно  памятати  що:

  1.  відємний   результат  представляється  в  двійковому   додатньому  коді,
  2.  Будь-який  залишок  має  той  же  знак,  щой  частка  
  3.  Якщо  попробувати  виконати   ділення  на  0,  і  якщо  результат  від  ділення  не  буде  поміщатись  в  заданий  операнд  призначення,  то  буде  генеруватись  переривання  ділення  на  0,   яке  зупинить  програму.

ПЕРЕТВОРЕННЯ  БАЙТІВ  , СЛІВ  І  ПОДВІЙНИХ   СЛІВ

 При  використанні знакових  двійкових  значень  часто  потрібно  перетворювати  8-бітові  значення  байтів  в  16-бітові  слова,  зокрема, для  підготовки до  множення   і  ділення.  Ці  перетворення   виконувати  складно,  тому  для  спрощення  введено  команди:

cbw-перетворити  байт  в  слово  

cwb-перетворити  слово  в  двійкове  слово

Команда  cbw  розширює  8-  бітове  значення  до  16-бітового

Команда cwb  розширює  16-бітове  значення  до  32-бітового   двійкового  слова.

 Ці  команди  виконують  однакові  дії,за  винятком  кількості  опрацьованих  бітів.

Потрібно  памятати  про  обмеження:

Початкове  значення  для  cbw повинно   знаходитись  в  регістрі  al  16-бітовий  результат  завжди  поміщається  в  ах.

Початкове  значення  для  cwd  повинно  зберігатись  регістр  ах  32-бітовий  результат   завжди  поміщається  в    dx  i  ax.Як  правило  cbw  i  cwd  використовуються  разом  з  командами  imul  i  idiv  при  необхідності   ділення  та  множення  байтової  величини  на  слово.

Проте  ці  команди  можна  використовувати  і  в  інших  цілях.




1. . Russi within the Interntionl Trde System 3 2.
2. Моніторин та сценарний аналіз виникнення і розвитку НС
3. 14 12.0013.00 09
4. Реферат- Державне регулювання забезпечення продовольчої безпеки в Україні
5. Курсовая работа- Забывание как процесс памяти
6. Форд мотор компани.html
7.  для прямых показателей индивидуальный индекс производительности труда можно записать так- Для обратных
8. 1 Пока Фэйт спала собственные глаза казались ей до странности тяжёлыми а веки словно бы намертво к
9. Методические рекомендации к составлению конспектов утренней гимнастики физкультурных занятий вопросы для
10. Штрих Шеффера. Равносильности выражающие основные законы алгебры логики.html
11. УТВЕРЖДАЮ Главный судья соревнований Бондаренко А
12. IIбпересечение 2ух плоскостейо-п Способ замены плоскостей- аиз линии о-п сделать -- проецировать о
13. 6511-616890080118915-57
14. вариантов направления проектируемой дороги используется ряд показателей- длина трассы сумма преодолев
15. Келісілген Бекітемін Білім ба~дарламасы бойынша Жалпы білім беру п~ндеріні~ комитет б
16. ориентированных языков программирования
17. Холмогорское З
18. Технология монтажа металлических конструкций
19.  Охотник глупый и ничтожный охотник спутав кота с кроликом с этим мерзким травоядным грызуном выстрелил из
20. з курсу ldquo;БЖДrdquo; 1