test

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


Сообщения находятся вне этой схемы


В следующей статье разберём команды циклов.

Report Page