Создайте указатель на определенное местоположение

#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