Инструкция MOV странный целевой операнд

Я пытаюсь понять код для загрузчика Pintos, и что-то мне показалось странным в определенной строке.

addr32 movl %eax, init_ram_pages - LOADER_PHYS_BASE - 0x20000 В этой строке предполагается поместить число страниц по 4 КБ в переменную init_ram_pages, определенную в заголовочном файле как:
extern uint32_t init_ram_pages;

Я не понимаю, почему мы вычитаем из init_ram_pages эти значения? Что значит иметь операцию вычитания в целевом операнде mov?

Для дальнейших деталей:

Ниже приведен код, который устанавливает размер оперативной памяти (в страницах 4K) в%eax: (если я правильно понимаю)

    movb $0x88, %ah
    int $0x15
    addl $1024, %eax    # Total kB memory
    cmp $0x10000, %eax  # Cap at 64 MB
    jbe 1f
    mov $0x10000, %eax
1:  shrl $2, %eax       # (shift right by two = divide by 4)
                # now eax contains the number of 4K pages I guess?

Константа определяется как:

/* Kernel virtual address at which all physical memory is mapped.
   Must be aligned on a 4 MB boundary. */
#define LOADER_PHYS_BASE 0xc0000000     /* 3 GB. */

редактировать
Сама переменная определяется в том же файле следующим образом: (в разделе файла, который следует за.code32)

#### Physical memory size in 4 kB pages.  This is exported to the rest
#### of the kernel.d
.globl init_ram_pages
init_ram_pages:
    .long 0

1 ответ

Решение

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

Я предполагаю, что это часть загрузчика в реальном режиме, которая тем не менее собрана / связана с использованием карты памяти защищенного режима. Эта настройка, по-видимому, преобразуется между адресом защищенного режима, для которого ассемблер генерирует код, и адресами реального режима, которые процессор будет фактически использовать при запуске этого кода.

Другие вопросы по тегам