|
|
| Посл.отвђт | Сообщенiе |
|
|
Дата: Апр 7, 2003 11:21:09 Пардон за тупой вопрос, но как можно использовать память, выделенную под какую-нибудь структуру, под другую структуру(не используя регистр), кроме такого геморроя: .data ? file_data WIN32_FIND_DATA <> .code ... mov eax, offset file_data mov eax, (SHFILE_INFO ptr [eax]).hIcon |
|
|
Дата: Апр 7, 2003 11:49:26 · Поправил: P2M Аноним Апр 7, 2003 11:21:09 Можно воспользоваться (на свой страх и риск) директивой LABEL: [code] ts1 struct s1X dw ? s1Y dw ? ts1 ends ts2 struct s2A db ? s2B db ? s2C db ? s2D db ? ts2 ends .data? s2 LABEL ts2 s1 ts1 <> .code ... mov s1.s1X,0 ; word mov s2.s2A,0 ; byte [/code] Или UNION. |
|
|
Дата: Апр 7, 2003 12:13:12 Можно и так: str1 struct el_1 dd ? el_2 dd ? ends str2 struct el_A dd ? el_B dd ? ends .code ... mov esi,offset str1 assume esi:ptr str1 ;обращение к элементу первой структуры mov eax,[esi].el_1 ;обращение к элементу второй структуры, ;наложенной на первую assume esi:ptr str2 mov eax,[esi].el_A ... assume esi:nothing |
|
|
Дата: Апр 7, 2003 19:44:34 А еще лучше использовать локальные переменные. Код будет чище... |
|
|
Дата: Апр 7, 2003 21:26:02 P2M Или UNION. А ведь UNION специально для этого и существует: S1S2 UNION s1 S1 <> s2 S2 <> S1S2 ENDS LOCAL s:S1S2 s.s1.value_from_S1 - работа как с первой структурой s.s2.value_from_S2 - как со второй sizeof S1S2 - большее из S1 и S2 |
|
|
Дата: Апр 8, 2003 04:38:56 boozook ведь UNION специально для этого и существует Afaik не для того, чтобы использовать память, выделенную под какую-нибудь структуру, под другую структуру |
|
|
Дата: Апр 8, 2003 18:06:50 А для чего оно? |
|
|
Дата: Апр 9, 2003 04:50:09 boozook В общем, я с Вами согласен - чтобы по одному адресу можно было хранить переменные разных типов. Просто в вопросе темы я вижу желание сэкономить в малом (не использовать регистр, повторно использовать область памяти) в ущерб сопровождению. Так Вообще можно дойти до: [code] uAllMyVars UNION bByte db ? wWord dw ? dDword dd ? ofn OPENFILENAME <> wfd WIN32_FIND_DATA <> sfi SHFILEINFO <> ... uAllMyVars ENDS [/code] В этом смысле я согласен с AsmGuru62 - использовать локальные переменные |
|
|
Дата: Апр 9, 2003 12:43:53 P2M :) Согласен. Про локальные переменные: Разбирался я как-то в одной проге. Так, получается что компилятор Си умудряется использовать место аргумента функции под локальную переменную! Это ж какая экономия - целых 4 байта стека :) |
|
|
Дата: Апр 9, 2003 18:54:23 В общем-то такой код является нормальным: --- void scan (char* pstr) { int ch; while ((ch=*pstr++) != '\0') { //... } } --- Как видно из примера pstr используется как переменная, сканирующая строку. Просто не хочется тратить время на заведение новой переменной... надо написать как можно больше кода за меньшее время. |
|
|
Дата: Апр 9, 2003 23:26:36 Так Вы только облегчаете работу компилятору :) Я то пытался сказать, что компилятору Просто не хочется тратить время на заведение новой переменной... и если переменная более не исользуется или уже скопирована в какой-нибудь регистр, то вместо создания новой, он юзает старую. Еще если переменных мало, он может вообще обойтись одними регистрами... |
|
|
Дата: Апр 10, 2003 01:04:36 Согласен! Нынешние компиляторы могут наоптимизировать - кода нельзя узнать тупо глядя в дисассемблер... |
|
Powered by miniBB 1.6 © 2001-2002
Время загрузки страницы (сек.): 0.037 |