test
XalionВ двух прошлых статьях мы разобрали командные и стековые регистры компьютера. Всего их восемь: EAX, EBX, ECX, EDX, ESP, EBP, ESI, EDI.
Статья про командные регистры.
Статья про стековые регистры.
Сегодня разберём секции ассемблера и команды условий.
Секции
Код NASMа разделён на три секции: .data, .bss и .text.
section .data — переменные
В этой секции объявляем переменные. Программист должен выбрать сколько памяти выделять для каждой переменной. Память выделяется буквенной командой Define и припиской о размере выделяемой памяти.
Синтаксис объявления переменной:
Имя переменной — my_msg, her_age. Пробелы ставить нельзя, потому что ассемблер не поймет к чему это относится и выдаст ошибку о неизвестной команде.
Размер переменной — db, dt. Для переменной можно взять до 10 байт.
Значение переменной — символы и слова пишут в кавычках.
section .bss — будущие переменные
В этой секции мы резервируем место для неизвестных переменных. Их значения программа получит во время работы. Объявляется так же, как и переменные в .data, только вместо define используется reserve. Эту секцию мы начнём использовать позже.
section .text — код программы
Чтобы ассемблер понял, откуда должна начинаться программа, мы должны объявить глобальную метку _start — от неё начнётся исполнение кода, всё что над ней не выполняется.
Вообще, метки нужны для программистов, они облегчают работу с кодом: помечают начало циклов, функциий и тестовые куски кода.
Команды условий
CMP — сравнение
Команда сравнивает два числа и записывает результат во флаговый регистр. Результат получается после вычитания первого значения из второго: если разность больше нуля — первое больше второго, разность меньше нуля — второе больше первого, ноль — равны.
Во флаговом регистре хранится состояние процессора на данный момент и результаты выполнения команд. Если при вычитании чисел получился ноль, то CMP записывает 1 во флаг ZF, если нет, то записывает во флаг CF 0 если число положительное и 1 если отрицательное.
После команды CMP пишутся команды условных переходов:
JG метка — переход на метку если первое число больше второго.
JL метка — переход на метку если первое число меньше второго.
JZ метка — переход на метку если числа равны.
Это часто встречающиеся команды условных переходов, но существуют ещё семнадцать видов этих команд. Все изучать не будем, но если они будут встречаться, то обязательно расскажем как они работают.
JMP — безусловный переход
Для ассемблера, JMP означает “просто иди туда и не проси объяснений”, а для программиста это инструмент для ветвлений.
JMP метка — безусловный переход.
Код проверки знака числа. Скопируйте и проверьте код в онлайн компиляторе.
section .text global _start _start: mov eax, _ ; Впишите свое значение и заассемблируйте код mov ebx, 0 cmp eax, ebx jg positive jl negative je zero positive: mov eax, 4 mov ebx, 1 mov ecx, msg_p mov edx, len_p int 80h jmp exit negative: mov eax, 4 mov ebx, 1 mov ecx, msg_n mov edx, len_n int 80h jmp exit zero: mov eax, 4 mov ebx, 1 mov ecx, msg_z mov edx, len_z int 80h jmp exit exit: mov eax,1 int 80h ; если при вызове прерывания int 80h в eax лежит 1 — ;программа закрывается ;Для каждого случая выделяется своя переменная с предложением и ячейка ;для длинны этой сроки section .data msg_p db "Number is positive" len_p equ $ - msg_p msg_n db "Number is negative" len_n equ $ - msg_n msg_z db "Number is zero" len_z equ $ - msg_z
В следующей статье разберём команды циклов.