Что действительно СМЕЩАЕТ в среднем ассемблерном коде на 16 битов?

Одной функцией языка, которую я считаю несколько скрытыми, потому что я никогда не слышал об этом в течение моего всего времени в школе, является псевдоним пространства имен. На это не обратили мое внимание, пока я не столкнулся с примерами его в документации повышения. Конечно, теперь, когда я знаю об этом, можно найти его в любой стандартной ссылке C++.

namespace fs = boost::filesystem;

fs::path myPath( strPath, fs::native );
16
задан Peter Cordes 4 August 2018 в 03:08
поделиться

4 ответа

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

data SEGMENT USE16 ;# at segment 0200h, linear address 2000h

    org 0100h
    foo db 0

    org 01100h
    bar db 0

data ENDS

. Ассемблер видит, что foo находится со смещением 0100h от основания SEGMENT , поэтому везде, где он видит смещение foo , он помещает значение 0100h , независимо от значения DS в то время.

Например, если мы изменим DS на что-то другое, кроме основания сегмента данных , ассемблер предполагает:

mov ax, 200h            ; in some assemblers you can use @data for the seg base
mov ds, ax

mov bx, offset foo          ; bx = 0100h
mov byte ptr [bx], 10       ; foo = 10


mov ax, 300h
mov ds, ax

mov bx, offset foo          ; bx = 0100h
mov byte ptr [bx], 10       ; bar = 10, not foo, because DS doesn't match what we told the assembler

Во втором примере DS равно 0300h , таким образом, основание сегмента, на которое указывает DS , равно 03000h . Это означает, что ds: [offset foo] указывает на адрес 03000h + 0100h , который совпадает с 02000h + 01100h , который указывает на bar. .

19
ответ дан 30 November 2019 в 16:58
поделиться

Это просто означает адрес этого символа. Это немного похоже на оператор & в C, если вы с ним знакомы.

9
ответ дан 30 November 2019 в 16:58
поделиться

смещение означает, что регистр si будет равен смещению переменной значение1 (а не ее фактическому значению). Смещение - это адрес от начала сегмента памяти, в котором хранится переменная. Смещение обычно относится к сегменту ds (в вашем случае регистры ds и cs указывают на один и тот же сегмент).

3
ответ дан 30 November 2019 в 16:58
поделиться

В 16-битном режиме x86 адресное пространство не является плоским; вместо этого адреса состоят из смещения и «сегмента». «Сегмент» указывает на пространство размером 64 КБ, смещение находится внутри этого пространства.

См. http://en.wikipedia.org/wiki/Memory_segmentation

1
ответ дан 30 November 2019 в 16:58
поделиться
Другие вопросы по тегам:

Похожие вопросы: