@SaddledSharp
Кодер. Увлекаюсь информационной безопасностью.

Обьясните кто то про регистры в Ассемблере?

Всем привет.
Я начал учить Ассемблер.
Очень трудно воспринимается и у меня возник такой вопрос, на который еще никто не ответил.
Зачем регистры нужны?
Это как переменные?
Если переменные - то это их имена?
А зачем их несколько? Rax, rbx, rcx?
Это типа как int, char, double?
Самый главный вопрос здесь - я не пойму как они действуют.
К примеру я написал такой код:
format ELF64
public _start

new_line equ 0xA

msg db "WTF, Dude", new_line, 0
len = $-msg

_start:
    mov eax, 4
    mov rbx, 1
    mov rcx, msg
    mov rax, len
    int 0x80
    call exit
exit:
    mov rdx, 1
    mov rbx, 0
    int 0x80

Мне выбивает "Ошибка сегментирования".
Как вы поняли регистры? Я вот например из-за ошибки сегментирования не могу понять как её исправить, потому что я не знаю как работают регистры и что они значат.
Изначально код был правильный, но я поменял там имена регистров что бы потренироваться.
Вообщем очень туго мне с ассемблером, пожалуйста, обьясните что это и как это работает и где это выучить что бы мне было понятно зачем я пишу эти регистры и что в них помещать??????
  • Вопрос задан
  • 4721 просмотр
Пригласить эксперта
Ответы на вопрос 4
@Mercury13
Программист на «си с крестами» и не только
У меня нет линукса, чтобы проверить, но, кажется, программа в корне неверна. Вы используете 32-битное соглашение вызова на 64-битной машине.
https://www.informatik.htw-dresden.de/~beck/ASM/sy...
https://blog.rchapman.org/posts/Linux_System_Call_...

Откуда 32-битный вызов на x64 — дайте пруфлинк, может, в вашем линуксе так и есть.

Регистры — это маленькие и очень быстрые ячейки памяти, встроенные в процессор. Их ограниченное количество, и у них конкретные чётко зафиксированные названия.

Часто для работы с данными малых разрядностей и совместимости с ранним кодом процессор даёт доступ и к половинкам регистров. Так, нижняя половина регистра rax — eax, нижняя четверть — ax, половины ax (соответственно восьмушки rax) называются al и ah. Сами понимаете: когда процессор был 16 бит, регистр назывался ax = al + ah. Сделали 32 бита — стал eax. Сделали 64 бита — стал rax.

Для вызова системных функций Linux используется такое соглашение вызова. Все функции висят на прерывании 0x80, rax — название функции, остальные параметры рассовываются по регистрам.

Насчёт int, char, double. Знаковость (signed/unsigned) определяется инструкциями ассемблера (например, ja = jump if above для unsigned, jg = jump if greater для signed). Длина — задействованным куском регистра (rax = long long, eax = int/long, ax = short, al = char). С дробными числами работает отдельный блок процессора, т.н. сопроцессор, со своими регистрами (в первых x86 он был отдельной микросхемой, существовавшей не во всех компьютерах, отсюда название).
Ответ написан
@lubezniy
Регистр - это аппаратная ячейка статической памяти внутри процессора, которой присвоено имя. И есть команды или подпрограммы, которые что-то делают с значением из этого регистра. В примере по команде int 80h (программное прерывание) выполняется системный вызов, который в зависимости от значений в конкретных регистрах (должно быть описано в документации к системе, что куда помещать) делает ту или иную вещь. Соответственно нужно просто посмотреть документацию и найти в ней это описание, а дальше разберётесь.
Ответ написан
Moskus
@Moskus
Регистры - это не переменные. Это ячейки памяти в процессоре. Их нельзя именовать от балды, как переменные в языках высокого уровня. Потому что это конкретные физические ячейки, за которыми закреплены некие буквенные названия.
Они могут использоваться с самыми разными целями, и от того, с какой целью используются в конкретный момент, в них нужно "класть" самое разное.
Что конкретно нужно туда класть - зависит от того, какую команду вы собираетесь выполнить.
Что именно и куда именно класть - написано, сюрприз, в документации. Путем переписывания кода от балды, вы Ассемблер никогда выучить не сможете, там нужно сначала понимать, что вы делаете, а потом - делать.
Ответ написан
Комментировать
@raamid
Проще понять что такое регистры МП на примере человека. Регистр - это рука, в которую процессор берет число, чтобы потом что-то с ним сделать (сложить, умножить или просто записать куда-то). У современных микропроцессоров таких регистров очень приблизительно от 5 до 50.
Работа с регистрами происходит на тактовой частоте процессора. Это самая быстрая "память", хотя называть регистр памятью, это то же самое, что называть руку человека полкой для хранения. Конечно рука может некоторое время выполнять роль полки, но это очень нерационально.
Ниже регистров по быстродействию идет кеш-память процессора, к кешу программист не имеет прямой возможности обратиться, это просто хранения часто используемой информации. Еще ниже по быстродействию - оперативная память, к ней можно обращаться из программы, например записать число из регистра в ячейку оперативной памяти. Еще ниже т.н. "внешнаяя" память. Это там где храняться файлы - жесткий диск, флешки, и т.д.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы