Сегментация реального режима в x86 - PullRequest
1 голос
/ 18 февраля 2020

В реальном режиме доступ к ячейкам памяти часто осуществляется с использованием сегментной адресации. Физическое местоположение рассчитывается следующим образом:

physical address = segment address * 16 + offset

Однако мне не требуется помощь в понимании приведенного ниже кода, взятого из здесь

#include "common.h"
BEGIN
    CLEAR

    /* It is not possible to encode moving immediates
     * to segment registers: we must either:
     *
     * * pass through a general register ax
     * * pop from the stack
     */
    mov $1, %ax
    mov %ax, %ds
    mov %ds:msg, %al
    PUTC <%al>

    /* %ds is the default segment for GAS memory operations
     * if we don't write it explicitly.
     */
    mov msg, %al
    PUTC <%al>

    hlt
msg:
    /* Push the correct A forward 16 bytes in memory
     * to compensate for the segments.
     */
    .fill 0x10
    .byte 'A'
  1. Как это сделать %ds:msg оценивается? Мы делаем% ds + адрес сообщения? Зачем нам нужен 1 в% ds?
  2. "Pu sh правильный A вперед 16 байтов в памяти для компенсации сегментов" о какой компенсации идет речь?

Пожалуйста, помогите .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...