А что такого сложного в регистрах?
Все просто, в Си вы можете создать переменную разного типа - строка, число, кортеж, массив, флоат, целочисленное число и так далее.
А в ассемблере есть только байт, слово, двойное слово - все кратно байту.
В Си вы можете создать сколько угодно произвольных переменных - a, b, x, y, counter, mysupervariable и хранить в них значения
У процессора нет возможности создавать произвольные переменные. Но есть железно зашитые прямо в процессоре регистры.
И инструкции процессора умеют с регистрами работать.
Некоторые регистры активно используются для хранения промежуточных значений.
Например в Си вы можете
x = 3 * 6
А в ассемблере нельзя
ячейка_памяти_по_адресу(100) = 3*6
Нет такой инструкции, не предусмотрена архитектурой процессора.
Зато можно занести в регистр AX = 3, в регистор BX = 6 и вызвать инструкцию процессора - умножь значение AX на BX, значение автоматически поместится в AX.
mov ax, 3
mov cx, 6
mul cx
Результат будет в регистре AX. Затем второй инструкцией можно будет занести результат из AX в ячейку памяти 100.
mov [100h], ax
Вот и все.