Примеры команд пересылки данных
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 и выполнение цикла прекратиться.