Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 12.06.2011, 15:36   #1
Obert
 
Регистрация: 20.05.2010
Сообщений: 7
По умолчанию ассемблер в Delphi, адрес переменной

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

Вот я начал (пока для примера просто определяем содержимое переменной field [1,1]):
Код:
function assmblr:integer;
var
  P: Pointer; // переменная-указатель
begin
  P:=Addr(field);
  asm
    pushad // сохранение регистров общего назначения

    mov ebx,P
    mov eax,[ebx]
    mov Result,eax

    popad  // восстановление регистров общего назначения
  end;
end;
Правильно ли это? Меня смущает, что регистр ebx 32-разрядный, а значит не может указывать на область памяти выше ~4 Гб, верно? У меня этот код работает верно, но если массив field будет расположен в учатке памяти выше 4 Гб?
Obert вне форума Ответить с цитированием
Старый 12.06.2011, 15:39   #2
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

Цитата:
но если массив field будет расположен в учатке памяти выше 4 Гб?
а не будет он там расположен.
у вас приложение то 32-ых битное.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 12.06.2011, 15:49   #3
Obert
 
Регистрация: 20.05.2010
Сообщений: 7
По умолчанию

Цитата:
Сообщение от Пепел Феникса Посмотреть сообщение
а не будет он там расположен.
у вас приложение то 32-ых битное.
А если Windows 64-битная, поддерживающая память больше 4 Гб? Всё равно будет считаться, что приложение находится не выше 4 Гб?
Obert вне форума Ответить с цитированием
Старый 12.06.2011, 15:55   #4
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

приложения видят лишь виртуальное адресное пространоство.
и с ним и работают.
для 32 битов оно составляет макс 4ГБ(на практике меньше) а где оно на самом деле расположено в физ памяти для приложений не важно.
этим заведует ОС.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 12.06.2011, 15:58   #5
Obert
 
Регистрация: 20.05.2010
Сообщений: 7
По умолчанию

Понятно, спасибо.
Obert вне форума Ответить с цитированием
Старый 12.06.2011, 15:59   #6
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
Меня смущает, что регистр ebx 32-разрядный, а значит не может указывать на область памяти выше ~4 Гб, верно?
Отчасти. Именно потому для длинной адресации используют два регистра - один базы, другой смещения. Хотя если честно я такую схему видел только в ДОС приложениях, но уверен что она и по сей день не умерла.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 12.06.2011, 16:07   #7
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

Цитата:
Хотя если честно я такую схему видел только в ДОС приложениях
она только в реальном режиме и нужна.
в защищенном режиме сегментные регистры имеют совсем иное назначение.
Цитата:
но уверен что она и по сей день не умерла.
теоритечески ОС может дать сегмент данных/кода/стека/еще чегонить
и будет более 4ГБ в вирт пространстве.
но тогда оно не будет монолитно(прощай динамическое изменение кода, либо же отдельный сегмент для данных кода)

в принципе в дескрипторе сегмента есть поля база и предел, но уже с селекторами нельзя так просто химичить как в реальном режиме с базой.
ибо сегментный регистр обязан содержать селектор нужного дескриптора.
а к самому дескриптору приложения доступ не имеют.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 12.06.2011, 16:18   #8
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
в защищенном режиме сегментные регистры имеют совсем иное назначение.
Согласен. Не учел
I'm learning to live...
Stilet вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Адрес переменной _-Re@l-_ Паскаль, Turbo Pascal, PascalABC.NET 16 30.12.2010 12:02
Адрес переменной _-Re@l-_ Общие вопросы .NET 3 25.12.2010 16:58
Адрес переменной kostyan777 Общие вопросы C/C++ 4 11.07.2010 22:16
Адрес переменной: Вопрос Black-Sparkle Общие вопросы C/C++ 11 11.08.2009 14:59
Адрес переменной Pedro Общие вопросы Delphi 11 16.12.2008 13:03