Создать указатель на конкретное место - PullRequest
1 голос
/ 06 мая 2011

Мне нужен указатель на местоположение, которое всегда одинаково. Итак, как я могу создать указатель на ... скажем, адрес памяти 0x20 и сохранить его каким-то образом, чтобы иметь доступ к нему позже. Замечания: Я не хочу хранить результат, но фактический указатель на адрес памяти (так как я хочу указать на начало массива).

Заранее спасибо.

-

Я думаю, что исправил это сейчас. Я использую прерывание BIOS 0x15, чтобы получить карту памяти. Каждое прерывание возвращает 1 запись, и вы указываете в es: di место, где BIOS может его сохранить. Я позволил биосу собрать его с 050h: 0h. Мне понадобился указатель на 0x50: 0x0 (0x500 linear), чтобы использовать карту позже. Я все еще должен проверить, но я сделал следующее:

    mov ax, 0x50
    mov es, ax
    xor di, di

    shl ax, 4
    add ax, di
    mov [mmr], ax

И ммр объявлен так:

mmr:
    dw 0 ; pointer to the first entry
    db 0 ;entry count
    db 24 ; entry size

Ответы [ 2 ]

3 голосов
/ 06 мая 2011

Указатель - это просто адрес памяти, а адрес памяти - это просто число.Сборка не является типизированным языком, поэтому нет никакой разницы.

Кроме того, сборка на самом деле не имеет переменных.Он имеет регистры и ячейки памяти, которые могут использоваться для хранения значений, включая адреса / указатели.

Так что в основном существует много вариантов инструкции x86 MOV, которые могут хранить указатель, такой как 0x20 в адресе или реестре.Вы, конечно, хотите подумать о том, выполняете ли вы 32-битную или 64-битную сборку x86 (или 16-битную или даже 8-битную в этом отношении).

2 голосов
/ 06 мая 2011

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

...