По мотивам Меняю const. Стреляю себе в ногу и получается (комментарий)
Смысл в том, что если есть программа, а в ней объявлена переменная, например a0, как выше по ссылке (привожу без const для корректности)
#include <stdio.h>
static unsigned a0 = 0;
int main() {
*((int *)&a0) = 102; //или без выкрутасов просто a0=102
printf("%u\n", a0);
return 0;
}
То в ассемблерном листинге в месте, где присваивание, будет что-то вроде
leaq a0(%rip), %rax
movl $102, (%rax)
И вот я этого синтаксиса для lea понять не могу. То есть, ясно, что в rax грузится адрес переменной a0, чтобы в следующей инструкции туда по этому адресу mov числа 102 устроить, но что там делает rip - я этой магии в упор не понимаю.
Я это вижу как что буквально в rax грузится адрес a0+rip, но это же абсурд в данном случае (если кто скажет, что та программа не корректна - это не так, в корректной тоже rip)
Поясните пожауйста, что не так.