#memory #variables #pointers #assembly #nasm
#память #переменные #указатели #сборка #nasm
Вопрос:
Мне нужен указатель на местоположение, которое всегда одно и то же. Итак, как я могу создать указатель на .. допустим, адрес памяти 0x20 и сохранить его каким-либо образом, чтобы иметь возможность получить к нему доступ позже. Примечание: Я хочу сохранить НЕ результат, а фактический указатель на адрес памяти (поскольку я хочу указывать на начало массива).
Заранее спасибо.
—
Я думаю, что теперь я это исправил. Я использую прерывание bios 0x15 для получения карты памяти. Каждое прерывание возвращает 1 запись, и вы указываете в es: di указатель на место, где bios может ее сохранить. Я разрешаю bios создавать его с 050h:0h. Мне нужен был указатель на 0x50: 0x0 (линейный 0x500), чтобы использовать карту позже. Мне все еще нужно протестировать, но я сделал следующее:
mov ax, 0x50
mov es, ax
xor di, di
shl ax, 4
add ax, di
mov [mmr], ax
И mmr объявляется таким образом:
mmr:
dw 0 ; pointer to the first entry
db 0 ;entry count
db 24 ; entry size
Ответ №1:
Указатель — это просто адрес памяти, а адрес памяти — это просто число. Ассемблер не является типизированным языком, поэтому разницы нет.
Также в сборке на самом деле нет переменных. В нем есть регистры и ячейки памяти, которые могут использоваться для хранения значений, включая адреса / указатели.
Итак, в принципе, существует множество вариантов MOV
инструкции x86, которые могут хранить указатель, например, 0x20
в адресе или регистре. Вы, конечно, хотите подумать о том, выполняете ли вы 32-разрядную или 64-разрядную сборку x86 (или 16-разрядную или даже 8-разрядную, если уж на то пошло).
Комментарии:
1. Он находится в 16-разрядном реальном режиме. Итак, если я вас правильно понимаю, вы создаете указатель на линейный адрес 0x20 при выполнении перемещения eax, 20H
2. Я не свободно владею x86, большая часть моей сборки была на Z80 и Motorola 680×0 несколько лет назад, но да, вы вводите «значение» 0x20 в регистр eax. На самом деле вы не делаете с ним ничего указательного, просто сохраняя его. Разыменование его или получение смещения от него было бы типичными операциями с указателями. Также
EAX
это 32-разрядный регистр, если я правильно помню, но я никогда по-настоящему не понимал такие понятия, как «реальный режим».
Ответ №2:
x86:
предположим, у вас есть массив с именем list
mov bx, offset list
теперь в регистре bx у вас будет указатель на первую ячейку памяти из list
для ссылки на данные в ячейке памяти вы бы использовали [bx]
вот краткий пример использования синтаксиса intel:
;declare list in .data
list dw 0123h
;move 01h from memory to ax register (16-bit)
mov bx, offset list
mov al, [bx] ; al = 23h
Если вы хотите использовать указатель позже, вы можете сделать это:
push bx
затем pop bx
, когда вы захотите его использовать
или
mov point, bx ; declared in mmr