ПредишенСледващото

Когато се напише програма на асемблер, просто напишете командата процесор. процесор команда - това е просто кодекс или кодекси за операции или оперативни кодове. Опкодовете - всъщност "четим текст" - версия на шестнадесетични кодове. Поради това, асемблер се смята за езика за програмиране на ниско ниво, всичко това в асемблер директно превърнати в шестнадесетични кодове. С други думи, вие не разполагате с компилатор, който превръща език на високо равнище в областта на езиковото на ниско ниво, асемблер преобразува кода на асемблер само в данните.

В този урок ще разгледаме няколко операционни кодове, които са от значение за изчислението, побитови операции и т.н. Други опкодове: преходен екип, сравнения и т.н., ще бъдат обсъдени по-късно.

Числата в събранието могат да бъдат предоставени в двоичен, десетичен или шестнадесетичен. За да се покаже коя система да се използва броят трябва да бъде поставен след броя на буквите. За двоична система е написана буквата Б (пример: 0000010b, 001011010b), не можете да посочите нещо за десетичната система, след като броят или да посочите буквата D (примери: 4589, 2356d), за системата на шестнадесетичен, че е необходимо да се уточни писмо ч, шестнадесетично число, че е необходимо да се напише на нула в началото (примери: 00889h, 0AC45h, 056Fh, неправилно F145Ch, S123h).

Първият отбор ще бъде добре познат на всички MOV. Тази команда се използва за копиране (игнорирай име на команда) стойност от едно място на друго. Това "място" може да бъде регистър, място в паметта, или незабавно стойност (точно както първоначалната стойност). Синтаксисът на командата е:

Можете да копирате стойността от един регистър в друг.

например: тази команда - не важи:

Това Кодът се опитва да постави DWORD (32-битова) стойност в байт (8 бита). Това не може да се направи Mov команда (има и други отбори).

И тези команди са верни, защото те имат на източника и приемника не се различава по размер:

Можете също така да получите сумата от паметта и сложи егото в регистъра. Да вземем например следната схема памет:

(Всеки блок представлява байт)

Стойността на отклонението е определен тук като един байт, но в действителност това е - 32-битова стойност. Да вземем за пример 3А, също така е - стойност на 32-битова: 0000003Ah. Просто да се спести място, някои се използва малък офсет.

Погледнете 3А в таблицата по-горе компенсиране. Данни за това изместване - 25, 7А, 5E, 72, EF и т.н. За да поставите стойността на офсет 3A, например, в регистъра, вие също ще използва команда MOV:

Средства поставят стойността DWORD с по размер (32 бита) от паметта с 3Ah компенсира в регистър EAX. След като стартирате тази команда, EAX съдържа 725E7A25h стойност. Може би сте забелязали, че тя е - инверсия на това, което е в паметта: 25 7А 5E 72. Това е така, защото стойностите се съхранява в паметта, като се използва малко къс формат. Това означава, че най-маловажния байт се съхранява в най-значимият байт: байт ред на гърба си в предната част. Мисля, че тези примери ще покажат това:

  • DWORD (32-битова) стойност 10203040 хекс се съхраняват в паметта като: 40, 30, 20, 10
  • Думата (16-битова) стойност 4050 шестнадесетичен се запаметява в паметта като: 50, 40

Връщайки се към примера по-горе. Можете да го направите с други размери:

Може би вече знаеше, че КОП префикс показва, че трябва да вземем някои от размера на паметта. А префикс преди указател_към_нея представлява размерът на данни:

Понякога размер може да се пропусне:

Тъй като EAX - 32-битов регистър, който извършва сглобяването осъзнава, че това също изисква стойност на 32-битова, в този случай, на паметта компенсира 403045h.

Можете също така да насочи значения:

Тази команда просто пише регистър EDX, стойността 5006. В скоби [и], се използват за получаване на стойност от паметта (в скобите се компенсира), без скоби, това е просто незабавна стойност.

Също така е възможно да се използва регистъра като клетка с памет (трябва да е 32-битова и 32-битови приложения):

В Mov CX, [EAX] процесорът първи вид, стойност (= памет клетки) съдържа EAX, която стойност след това се съхранява в същата памет клетката и съхранява тази стойност (дума, 16 бита, защото приемника, СХ, е 16- битов регистър) в CX.

  • 1: вкара 100 в ECx
  • 2: пуснати 200 в EAX
  • 3: Място стойност на ECx (= 100) в пакета (първият се намира)
  • 4: поставете стойността на EAX (= 200) в пакета (последният поставя)
  • 5/6/7: извършване на операции по ECx, ECx стойност варира
  • 8: извличане на стойност от купчината в EBX: EBX ще бъде 200 (последния режим, първата екстракция)
  • 9: извличане на стойност от купчината в ECx: ECX отново става 100 (първи разположение, последната екстракция)

За да разберете какво се случва в паметта, когато поставяте и премахване на стойностите в стека, виж фигурата по-долу .:

(Stack се запълва с нули, но в действителност това не е като тук). ESP стои на мястото, за които се посочва)

Една важна забележка: регистър EAX е почти винаги се използва за съхранение на резултата от процедурата.

Това важи и за прозорци функции. Разбира се, можете да използвате всеки друг регистър в собствените си процедури, но това е стандарта.

Това сложи край на следващия урок. В следващия урок ще напишем първата програма на асемблер.

За 0 в началото на шестнадесетични числа. Това е, което е написано по този въпрос в Зубков ( "асемблер за DOS, Windows и Unix", 1.2.3 шестнадесетичен.):


В асемблерни програми за записване на номера започващи с A, B, C, D, E, F, в началото, приписвани на "0", за да се избегне объркване с името на променливата номер, или друг идентификатор. След шестнадесетичен вид, буквата «з»

Свързани статии

Подкрепете проекта - споделете линка, благодаря!