Локальные переменные и ассемблер.

Раздел посвящен программированию с использованием Power Basic.
Mikle
Изобретатель велосипедов
Изобретатель велосипедов
Аватара пользователя
 
Сообщения: 4148
Зарегистрирован: 25.03.2003 (Вт) 14:02
Откуда: Туапсе

Локальные переменные и ассемблер.

Сообщение Mikle » 15.04.2009 (Ср) 15:22

Создаю на уровне модуля переменную:
Код: Выделить всё
Global X as long

В асм-вставках использую и так:
Код: Выделить всё
mov eax, X

и так:
Код: Выделить всё
mov ah, X[2]

в ah загружается второй байт. Все работает. Но если X объявить не Global, а просто Dim на уровне процедуры, то второй вариант не проходит, ругается на размер операнда. Подскажите, что делать? Нужны именно локальные переменные, Static не подходит (функция может использоваться из двух потоков одновременно, это DLL).

jangle
Википедик
Википедик
Аватара пользователя
 
Сообщения: 3013
Зарегистрирован: 03.06.2005 (Пт) 12:02
Откуда: Нидерланды

Re: Локальные переменные и ассемблер.

Сообщение jangle » 15.04.2009 (Ср) 19:09

а выложи код, размер переменной не зависит от того глобальная она или локальная

Mikle
Изобретатель велосипедов
Изобретатель велосипедов
Аватара пользователя
 
Сообщения: 4148
Зарегистрирован: 25.03.2003 (Вт) 14:02
Откуда: Туапсе

Re: Локальные переменные и ассемблер.

Сообщение Mikle » 16.04.2009 (Чт) 8:20

Код: Выделить всё
#COMPILE DLL

OPTION EXPLICIT

'Так файл компилится, если заремить "GLOBAL x AS LONG"
'И снять REM со строки "DIM x AS LONG" - то нет.

GLOBAL x AS LONG

FUNCTION LIBMAIN (BYVAL hInstance   AS LONG, _
                  BYVAL fwdReason   AS LONG, _
                  BYVAL lpvReserved AS LONG) AS LONG

  ! mov FUNCTION, 1

END FUNCTION

SUB TEST() EXPORT
'DIM x AS LONG

  ! mov eax, x ;это работает всегда
  ! mov ah, x[0]; это - только если x глобальный

END SUB

jangle
Википедик
Википедик
Аватара пользователя
 
Сообщения: 3013
Зарегистрирован: 03.06.2005 (Пт) 12:02
Откуда: Нидерланды

Re: Локальные переменные и ассемблер.

Сообщение jangle » 16.04.2009 (Чт) 9:40

Mikle - отключи автоматическое распределение регистров процессора компилятором.


Код: Выделить всё
#Compile Dll
Option Explicit

Function LibMain (ByVal hInstance As Long, _
ByVal fwdReason As Long, _
ByVal lpvReserved As Long) As Long
! mov FUNCTION, 1

End Function

Sub TEST() Export
   #Register None
    Local x As Long
    ! mov eax, x ;это работает всегда
    ! mov ah, x[0]; это - только если x глобальный
End Sub
                 

Mikle
Изобретатель велосипедов
Изобретатель велосипедов
Аватара пользователя
 
Сообщения: 4148
Зарегистрирован: 25.03.2003 (Вт) 14:02
Откуда: Туапсе

Re: Локальные переменные и ассемблер.

Сообщение Mikle » 16.04.2009 (Чт) 16:45

Спасибо, попробую.
Вообще странно, переменная может использоваться из асма, а отдельный ее байт - нет.

Mikle
Изобретатель велосипедов
Изобретатель велосипедов
Аватара пользователя
 
Сообщения: 4148
Зарегистрирован: 25.03.2003 (Вт) 14:02
Откуда: Туапсе

Re: Локальные переменные и ассемблер.

Сообщение Mikle » 17.04.2009 (Пт) 10:24

Все работает, спасибо.


Вернуться в Power Basic

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 5

    TopList