1.Когда задан сегмент данных растущий вниз возник вопрос, если допустим база = 200000h, лимит=0FFFFFh, B=1, то как я понял допустимые линейные адреса лежат в диапазоне от база+лимит=2FFFFFh до 0FFFFFFFFh(B=1), и размер данного сегмента получается равен 0FFFFFFFFh-2FFFFFh. Тогда вообще зачем используется поле лимит? Короче кто-нибудь может описать данный вопрос на пальцах. 2.Также В IA-32 Intel® Architecture Software Developer’s Manual Volume 3: System Programming Guide написаны: • Stack segment (data segment pointed to by the SS register). The flag is called the B (big) flag and it specifies the size of the stack pointer used for implicit stack operations (such as pushes, pops, and calls). If the flag is set, a 32-bit stack pointer is used, which is stored in the 32-bit ESP register; if the flag is clear, a 16-bit stack pointer is used, which is stored in the 16-bit SP register. If the stack segment is set up to be an expand-down data segment (described in the next paragraph), the B flag also specifies the upper bound of the stack segment. • Expand-down data segment. The flag is called the B flag and it specifies the upper bound of the segment. If the flag is set, the upper bound is FFFFFFFFH (4 GBytes); if the flag is clear, the upper bound is FFFFH (64 KBytes). Короче как я понял если в SS загружен селектор на дескриптор описывающий стек , и если B=1 для команд неявно оперирующими стеком используется ESP, иначе SP. Отсюда вопрос если дескриптор кода описывает 16 битный сегмент, а в дескрипторе сегмента стека установле бит В=1, то каким регистром будет оперировать процессор SP или ESP?
все зависит от текущей разрядности сегмента кода если он 32-ух разрядный и инструкция без префикса (0x66) => ESP если он 32-ух разрядный и инструкция с префиксом (0x66) => SP если он 16-ти разрядный и инструкция без префикса (0x66) => SP если он 16-ти разрядный и инструкция с префиксом (0x66) => ES ты же сам ответил: определяет допустимый интервал для SP/ESP