· Начало · Статистика · WASM.RU · Noir.Ru ·

 WASM Phorum (Оффлайн - 24.11.2003) —› WASM.ASSEMBLER —› Cтатическая память

Посл.отвђт Сообщен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