Высокоуровневые языки и ассемблер

👁 151 просмотров
1 Звезда2 Звезды3 Звезды4 Звезды5 Звезд (Пока оценок нет)
Загрузка...

Высокоуровневые языки внедряют дополнительный непрозрачные разделительные уровни между ЦПУ и исходным кодом. Примером такой непрозрачной концепции являются переменные. Эти переменные имеют хранилища, которые могут хранить числа, текстовую строку или простое булевое значение. В исходном коде имя переменной представляет место, где находиться переменное значение, определенное для определенного типа: числа с его форматом, строки с ее длиной и т.д. Для изучения ассемблера надо просто забыть про концепцию переменных в высокоуровневом языке. Ассемблер знает только биты, баты, регистры и байты SRAM. Термин «переменные» не имеет смысла в ассемблере. Кроме того, связанные термины, как «типы» бесполезны и не имеют никакого смысла здесь.
Высокоуровневые языки требуют от тебя определения переменных перед их использованием в исходном коде, например, как типы Byte (8-bit), double word (16-bit), integer (15-bit плюс 1 знак бита). Компиляторы для данного высокоуровневого языка перемещают такие задекларированные (определенные) переменные в любое доступное хранилище, включая и 32 регистра общего назначения, которые есть у AVR. Размещением переменных в регистры занимается компилятор, который сам выбирает место хранения по определенным приоритетным правилам, словно этим занят программист на ассемблере и вся рутинная работа в операциях с данными ложитья на плечи компилятора. Программист может только догадываться, о чем компилятор «думал», когда перемещал переменную в ту или иную ячейку памяти или регистр и право на решение заключено за компилятором. Это снимает с программиста неприятностей, связанных с решениями хранения переменных, но, в некотором смысле, делает и рабом компилятора. Инструкция «A = A + B» теперь типизирована: если «A» определен, как символ, а «B» — как число, то формулировка будет неправильной, так как число нельзя оперировать сложением с символом строки. Программисты на языках высокого уровня предполагают, что ошибка о неправильных формулировках операций позволяет им избегать различных глупостей при написании кода. Защита, которую предоставляет компилятор, данном случае, запрещающая использование разных типов в операторе сложения, довольно бесполезна: добавление 2 к символу «F», конечно, должно привести к «H», как результат, так как на уровне железа это все бинарные цифры и только на уровне компилятора высокого уровня типы делятся на строки, символы, целые числа, числа с плавающей точкой и т.д.
Ассемблер позволяет вам сложить числа, такие как 7 или 48, вычитать байтовые хранилища, не вдаваясь в то какие типы хранятся в этих хранилищах. Что находиться в каждом хранилище определяет не компилятор, а сам программист на ассемблере. Если, например, четыре регистра представляют одно 32 – битное число или четыре символа ASCII, то эти четыре байта могут быть размещены в регистрах как low-to-high, high-to-low или в полностью смешанном виде самим программистом. Программист, в ассемблере, является главным в решении размещения данных и самостоятельно должен контролировать весь процесс отладки. Типы неизвестны, все значения находятся в виде битов и байтов, доступных в любом хранилище данных (регистрах или SRAM). Программист должен не только организовать хранение данных, но и оптимизировать их работу, что не скажешь о программистах языков высокого уровня, которые ограничены в этом.