ib := ib + ia;
end;
Рисунок Результат трансляции программы 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 и выполнение цикла прекратиться.