Добавить в корзинуПозвонить
Найти в Дзене
Old Programmer

Программирование на assembler (ассемблер для Linux). Вложенные циклы

Доброго времени суток, а я снова об ассемблере.
Здесь все ссылки на материалы Old Programmer. А вот это ссылки на все мои статьи, где есть язык ассемблер. Рекомендую также познакомиться со структурой моего канала.
Предыдущие статьи:
Сложные логические условия на ассемблере (GNU assembler, Linux, x86-64)

Доброго времени суток, а я снова об ассемблере.

Здесь все ссылки на материалы Old Programmer. А вот это ссылки на все мои статьи, где есть язык ассемблер. Рекомендую также познакомиться со структурой моего канала.

Предыдущие статьи:

  • Сложные логические условия на ассемблере (GNU assembler, Linux, x86-64)
  • Ассемблер для Linux. Локальные переменные (продолжение)
  • Ассемблер, команды ассемблера, основные конструкции (assembler x86-64)
  • GNU assembler x86-64 Linux. Стек и команды ассемблера

Когда работаем с циклами на ассемблере то в первую очередь заботимся о том, чтобы не потерять те данные (переменные) которые в циклах используем.

Вложенные циклы на языке assembler (циклы loop)

Вложенные циклы будем рассматривать на основе цикла loop, хотя на основе материала из предыдущей статьи вы легко может конструировать циклы на основе команд условных и безусловных переходов или в комбинации с командой loop.

Как вы уже знаете команды loop работает с регистром rcx. По сути он является для этой команды регистром - индексом. Но поскольку циклы вложенные, а индекс один, мы должны позаботиться о том, чтобы сохранять значение индекса для каждого цикла. Естественно было бы использовать для этой цели стек.

В ns4000.s представлена программа трех вложенных циклов. Индекс в каждом из этих циклов проходит значение от 1 до 10, и функция printn (см. print.c) внутри циклов должна выполниться 1000 раз. Программа печатает числа от 1 до 1000 из переменной num.

Компиляция программы осуществляется командами

as --64 ns4000.s -o ns4000.o
gcc -c print.c
gcc -no-pie print.o ns4000.o -o ns4000

Теперь рассмотрим ситуацию, когда переменные цикла хранятся в ячейках памяти (см. ns4001.s). Программа выполняет точно такую же работу, что и программа ns4000.s.

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

as --64 ns4001.s -o ns4001.o
gcc -c print.c
gcc -no-pie print.o ns4001.o -o ns4001

Замечание
Использование стека для хранения переменной цикла дает все таки определенное преимущество. Оно позволяет строить структуры с циклами произвольной вложенности. Если же хранить переменные цикла в в обычной памяти, то для каждой переменной придется отдельно резервировать память.

На сегодня все, но ассемблер на нашем канале Old Programmer продолжается. Подписывайтесь, ставьте лайки и комментируйте.

assembler forever
assembler forever