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

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

Вернуться   Форум программистов > Низкоуровневое программирование > Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 02.09.2011, 21:46   #1
Dimarik
Форумчанин
 
Аватар для Dimarik
 
Регистрация: 18.04.2009
Сообщений: 688
По умолчанию сегментные регистры

Добрый вечер! Возник вопрос по сегментным регистрам. Вроде бы когда мы программируем под Windows в отлиие от DOS-a вся память - один сегмент. Или же просто сегмент кода не делится на части? И имеется 3 сегмента: сегмент данных, сегмент кода и сегмент стека.
Ну, рассмотрел несколько примеров. В принципе, они имеют очень много общего между собой:
ПРИМЕР № 1
Код:
        PUSH OFFSET HANDLER 
PUSH FS:[0] 
MOV FS:[0],ESP 
... 
... 
... 
POP FS:[0] 
ADD ESP,4h 
RET
в принципе просто непонятно что значит FS:[0]?
что мы помещаем в стек?

ПРИМЕР № 2

Код:
assume edi:ptr IMAGE_DOS_HEADER
add edi, [edi].e_lfanew

непонятна первая строка. Не одно ли то же это, что mov edi, IMAGE_DOS_HEADER
и обычно когда пишут ptr - это ж типа указатель, пишут на что указывает, на BYTE или DWORD.
Данный пример был взят из туториалов по ассемблеру с WASM-а (стр. 284).
со второй строкой только один вопрос. насколько я понимаю, EDI - указатель на структуру. почему не написано как-то так
add edi, BYTE PTR [edi].e_lfanew
просто всегда когда обращались по какому-нибудь адресу писали ____ PTR [adress]

ПРИМЕР № 3

пример из туториалов, только со страницы 273


Код:
assume fs:nothing
что это значит. nothing - зарезервированное слово?
это то же самое что
Код:
assume fs:0
??????????
Заранее спасибо.
Dimarik вне форума Ответить с цитированием
Старый 02.09.2011, 22:26   #2
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

Цитата:
в принципе просто непонятно что значит FS:[0]?
обращение по нулевому адресу сегмента FS.
FS особый сегмент, помоему это часть установки SEH обработчика.
Цитата:
Вроде бы когда мы программируем под Windows в отлиие от DOS-a вся память - один сегмент.
скажем так, это сегменты наложенные на одну и туже память(точнее адресное пространство)
а так в принципе верно.(по крайней мере для ds,es,cs,ss)
Цитата:
непонятна первая строка.
заставляем компилятор считать что в регистре edi, адрес структуры IMAGE_DOS_HEADER, соответственно далее и идет обращение к полю структуры.
Цитата:
почему не написано как-то так
в структуре итак известно какое поле какого типа.

про пример три не знаю.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 02.09.2011, 23:11   #3
SnX
Форумчанин
 
Регистрация: 30.10.2009
Сообщений: 114
По умолчанию

Цитата:
что значит FS:[0]
Thread Environment Block -> EXCEPTION_RECORD

UPD:
Цитата:
Код:
PUSH FS:[0] 
MOV FS:[0],ESP
Это явно похоже на установку обработчика SEH.

Последний раз редактировалось SnX; 02.09.2011 в 23:14.
SnX вне форума Ответить с цитированием
Старый 03.09.2011, 10:21   #4
Dimarik
Форумчанин
 
Аватар для Dimarik
 
Регистрация: 18.04.2009
Сообщений: 688
По умолчанию

это действительно установка SEH. Я про это читаю.Спасибо.
А какая разница между этим
Код:
assume edi:ptr IMAGE_DOS_HEADER
и

Код:
mov EDI, offset IMAGE_DOS_HEADER

Последний раз редактировалось Dimarik; 03.09.2011 в 10:23.
Dimarik вне форума Ответить с цитированием
Старый 03.09.2011, 12:48   #5
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

Цитата:
А какая разница между этим
в первом случае мы задаем тип данных на которые указывает edi, а во втором присваиваем edi, адрес структуры(если имелась в виду переменная этого типа, а не сам тип(второе нельзя))
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 03.09.2011, 13:19   #6
Dimarik
Форумчанин
 
Аватар для Dimarik
 
Регистрация: 18.04.2009
Сообщений: 688
По умолчанию

Цитата:
в первом случае мы задаем тип данных на которые указывает edi
В смысле? там же не указано никак, на DWORD указывает или же на BYTE. Или компилятор как-то автоматически начинает распознавать?
Dimarik вне форума Ответить с цитированием
Старый 03.09.2011, 13:30   #7
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

Цитата:
там же не указано никак
а это что?
Код:
assume edi:ptr IMAGE_DOS_HEADER
EDI->указатель на структуру IMAGE_DOS_HEADER.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 03.09.2011, 15:31   #8
yuran666666
Форумчанин
 
Аватар для yuran666666
 
Регистрация: 23.04.2009
Сообщений: 346
По умолчанию

assume это директива ассемблеру сопоставлять далее по листингу регистр/метку с указанной структурой. RTFM же
Нет, ну правда..
yuran666666 вне форума Ответить с цитированием
Старый 03.09.2011, 17:55   #9
Dimarik
Форумчанин
 
Аватар для Dimarik
 
Регистрация: 18.04.2009
Сообщений: 688
По умолчанию

спасибо большое
Dimarik вне форума Ответить с цитированием
Старый 04.09.2011, 11:29   #10
Dimarik
Форумчанин
 
Аватар для Dimarik
 
Регистрация: 18.04.2009
Сообщений: 688
По умолчанию

Код:
MOV D[EBX+4],2h 
MOV EDI,FS:[0] 
>L2: 
CMP D[EDI],-1 
JZ >L3 
PUSH EDI,EBX 
CALL [EDI+4] 
ADD ESP,8h 
MOV EDI,[EDI] 
JMP L2 
L3:
1. подскажите, пожалуйста, по поводу этой команды
MOV D[EBX+4],2h
зачем здесь D?
или это указывает что по адресу EBX+4т помещаем DWORD 2h????
2. и ещё имеется вопрос по поводу меток. почему то пишут >L2: а то просто jmp L2? или же знак > несёт особое значение
3. MOV EDI,[EDI] - как я понял, здесь в регистр EDI загружается значение, на которое указывал регистр EDI.
Только вот непонятно одно. откуда компилятор знает, загружать BYTE или DWORD или ещё что-то?
просто обычно писалось если загружали BYTE так:
mov EDI, BYTE PTR [EDI]

P.S.
я читаю мануал про SEH, там так написано. Win32 Exception handling for assembler programmers by Jeremy Gordon
Dimarik вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
pascal сегментные часы world12_tk Помощь студентам 9 03.06.2009 22:20
Регистры Манжосов Денис :) Помощь студентам 8 28.07.2008 12:48
Регистры RealSHELS Общие вопросы Delphi 3 28.03.2008 18:56
Регистры Elm0 Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 13 10.02.2008 19:49