Примеры команд пересылки данных

1. Если в результате предыдущей операции получаем нуль, перейти к известной ячейке (по известному смещению):

JZ 40h

Если результат предыдущей операции равен нулю переходим к инструкции, которая находится добавлением к текущему адресу 40h.

2. Безусловно перейти к ячейке адрес которой будет вычисляться на основании содержимого регистров.

JMP [BX + SI]

Переход выполняется независимо от состояния флагов, значение адреса новой инструкции берется из двух последовательных байт памяти, адрес первого из которых определяется суммой регистров BX и SI.

 

Пример простой программы 1 (использование команд пересылки данных и арифметических)

Рассмотрим, во что (в какие машинные команды) превратится в памяти компьютера очень простая программа на паскале.

Итак, программа следующая:

var ia,ib,ic : Smallint;

 

Begin

ia := 5;

ib := 3;

ic := ia + ib;

end;

 

 
 

В этой программе мы объявляем (резервируем в памяти) три переменных занимающих два байта (16 разрядов) каждая – в паскале этот тип называется Smallint. В теле программы первой переменной присваивается 5, второй – 3, а третьей – 5 + 3. Покажем результат трансляции этой программы в последовательность машинных инструкций (См рис. …)

 

Рисунок Результат трансляции программы 1

Рассмотрим результат трансляции построчно.

 

1. Первая стока (как и все прочие) состоит из трех частей

0044C878 66С705D8FB440005 mov word ptr [ia], $0005

           
     
 

 


Итак, первая группа из восьми шестнадцатеричных цифр представляет собой адрес, по которому располагается команда, в нашем случае адрес первой команды будет равен 0044C878h. (Почему в адресе указываются именно восемь позиций для шестнадцатеричных цифр, разберем в дальнейшем).

Вторая группа является собственно цифровым представлением машинной инструкции. Как видно, эта инструкция занимает в памяти восемь байт. (Напоминаю, что один байт записывается в две шестнадцатеричных позиции.) Необходимо обратить внимание, что в этом коде присутствуют оба операнда, операнд приемник (адрес переменой ia – 0044FBD8h) и операнд источник (число 5 – 0005).

Третья группа является символьным представлением инструкции. MOV – имя команды пересылки данных. word ptr – не команда, это лишь определитель размера данных, он показывает, что мы будем пересылать машинное слово, то есть шестнадцатиразрядное число (напоминаю, что переменная типа Smallint занимает 16 байт). [ia] это операнд приемник – адрес переменной ia. $0005 – операнд источник (символ $ означает что используется шестнадцатеричная система счисления).

В результате исполнения этой инструкции число 5 будет перемещено по адресу переменной ia, что полностью соответствует первой строке нашей программы

ia := 5;

2. Вторая строка имеет вид:

0044C881 66С705DAFB440003 mov word ptr [ib], $0003

Это инструкция расположена по адресу 0044C881 (обратим внимание, что этот адрес на восемь больше чем адрес первой инструкции). В результате исполнения этой инструкции число 3 будет перемещено по адресу переменной ib, что соответствует второй строке нашей программы.

3. Третья строка имеет вид:

0044C88A 66A1D8FB4400 mov ax, [$0044fbd8]

Здесь данные, находящиеся по адресу 0044fbd8h (это адрес переменной ia, в которой сейчас находится число 5) перемещаются в регистр AX.

4. Четвертая строка:

0044C890 660305DAFB4400 add ax, [ib]

К содержимому регистра AX добавим данные, находящиеся по адресу переменной ib (в переменную ib было помещено число 3).

Пятая строка содержит:

5. 0044C897 66A3DСFB4400 mov [$0044fbdс], ax

В результате исполнения этой инструкции содержимое регистра AX (там храниться результат сложения) будет перемещено по адресу 0044FBDСh, это адрес переменной iс. Третья, четвертая и пятая машинная команды соответствуют третьей строке исходной программы:

ic := ia + ib;

Пример простой программы 2 (использование команд переходов)

Новая программа будет использовать те же переменные, что и программа из первого примера.

var ia,ib,ic : Smallint;

Сама программа имеет вид:

Begin

for ia := 0 to 4 do

ib := ib + ia;

end;

 

 
 

Т.е. мы организуем цикл по переменной ia, которая меняется от 0 до 4, в цикле к переменной ib добавляем текущее значение ia (выполняем это пять раз). Результат трансляции этой программы показан на рис. …

Рисунок Результат трансляции программы 2

 

Рассмотрим полученный код построчно (для упрощения не будем больше показывать код инструкции, а ограничимся адресом команды и ее символьным представлением).

1. Первая строка обеспечивает начальное присвоение переменной ia нулю:

004D998 mov word ptr [ia], $0000

В результате исполнения этой инструкции по адресу переменной ia будет занесен 0. Напоминаем, что определитель размера данных word ptr показывает, что мы работаем с шестнадцатиразрядным числом.

2. Во второй строке готовимся выполнять сложение

004D9A1 mov ax, [$00450bd8]

Содержимое переменной ia, находящейся по адресу 00450BD8h, скопируем в регистр ax, при помощи которого будет производиться суммирование.

3. Третья строка выполняет непосредственное сложение

004D9A7 add [ib], ax

К содержимому находящемуся по адресу ib добавляем содержимое регистра ax (напоминаем, что в этот регистр было помещено значение находящееся в ia). Таким образом эта инструкция соответствует следующей строке программы

ib := ib + ia;

 

4. Четвертая строка обеспечивает увеличение переменой ia в цикле на единицу:

004D9AE inc [ia]

Команда inc обеспечивает приращение на единицу данных по адресу переменной ia.

5. Пятая строка нужна для сравнения содержимого переменой ia с конечным значением параметра цикла:

004D9B5 cmp word ptr [ib], $05

Инструкция cmp сверяет значение двух байт в памяти по адресу ib с числом 5, в результате будут установлены флаги в регистре флагов.

6. Шестая инструкция завершает наш цикл.

004D9BD jnz -$1e

Инструкция jnz (переход, если не равно нулю) выполняет ветвление по адресу второй инструкции (004D9A1h), если результат предыдущей операции не нулевой. Этот результат определяется по регистру флагов. Адрес ветвления находится так: к адресу команды следующей после текущей 004D9BFh (это содержание счетчика команд) добавляем смещение, указанное в команде -1Eh, получаем указанный адрес 004D9A1h. Когда количество проходов цикла достигает пяти, в переменной ia будет находиться 5 и выполнение цикла прекратиться.