Я следую за курсом Baking Pi из Кембриджского университета, в котором простая простая операционная система построена в наборе команд ARMv6, нацеливаясь на малину Пи.
Мы использовали два способа загрузки данных в регистры с помощью команды ldr
, и теперь я понимаю, что я использую их вместе, я не совсем понимаю, что они оба делают.
Итак, я использовал такие вещи, как ldr r0,=0x20200000
, которые я действительно понимал как "читать данные, хранящиеся в ячейке памяти 0x20200000, в регистр r0.
Затем я использовал такие вещи, как:
ldr r0,[r1,#4]
Я понял, что "прочитал данные, хранящиеся в адресе памяти, указанном r1, со смещением 4 байта, в регистр r0".
Затем я сталкиваюсь с этим:
ldr r0,=pattern
ldr r0,[r0]
pattern
здесь .int
в разделе .data
(растровое изображение, представляющее последовательность состояний включения/выключения для светодиода). Я понимаю, прочитав это, что мое предыдущее понимание =foo
должно быть неправильным, иначе обе вышеприведенные инструкции будут делать то же самое.
Синтаксис =x
в основном больше похож на указатель на C, а синтаксис [x]
выглядит так, как будто память, на которую указывает x
, действительно читается?
Скажем, ptr
в нижеприведенном C есть int*
, мои комментарии, думающие об эквивалентной сборке (концептуально, а не буквально), имеют какой-то смысл?
r0 = ptr; /* equivalent to: ldr r0,=ptr */
r0 = *ptr; /* equivalent to: ldr r0,[ptr] */
r0 = *(ptr+4) /* equivalent to: ldr r0,[ptr,#4] */