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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 25.10.2011, 11:08   #1
Fabeldyr
Пользователь
 
Аватар для Fabeldyr
 
Регистрация: 25.10.2011
Сообщений: 14
Стрелка Работа с массивом в ассемблерной вставке

доброго времени суток, долго искал решение своей проблемы на просторах интернета, так и не нашёл, видимо из-за почти нулевого знания asm'a.
суть проблемы: имеется функция, написанная в c++ builder, которая считывает данные, приходящие от устройства, подключённого к lpt-порту и выводит их на экран. процесс самого считывания написан в ассемблерной вставке, т.к. при написании команд на си цикл занимает 170мс, а на ассемблере - 25-30мс. и вот проблема в том - как правильно работать с массивом?
текст функции:
Код:
void __fastcall TForm1::read_buttonClick(TObject *Sender)
{
int i = 0;
unsigned char data[6];
AnsiString datastr = "
";

asm
{
mov al, 0
@@cycle:
mov dx, 037bh//порт адреса
out dx, al
mov ah, al
mov dx, 037ch//порт данных
in al, dx
mov data, al
как вот здесь перейти на следующий элемент массива?
mov al, ah
inc al
cmp al, 6//т.к. у устройства 6 адресов
jb @@cycle
}
for (i = 0; i < 6; i++)
{
datastr += IntToStr(i);
datastr += (" - ");
datastr += IntToStr(data[i]);
Memo1 -> Lines -> Add(datastr);
datastr = "";
}
}
прошу прощения за отсутствие смещения внутри фигурных скобок - пишу с КПК
Fabeldyr вне форума Ответить с цитированием
Старый 26.10.2011, 09:35   #2
Mikl___
Участник клуба
 
Регистрация: 11.01.2010
Сообщений: 1,139
По умолчанию

Fabeldyr
Код:
unsigned char data_[6];//data лучше не называть, так как это 
// зарезервированное слово в ассемблере
. . .
asm
{
mov ecx,6 //по числу адресов
mov esi,offset data_ 
mov al,0
@@cycle: mov dx, 037bh//порт адреса
              out dx, al
              mov ah, al
              mov dx, 037ch//порт данных
              in al, dx
mov [esi], al
inc esi // перешли на следующий элемент массива
mov al, ah
inc al
loop @@cycle
}
Mikl___ вне форума Ответить с цитированием
Старый 26.10.2011, 11:16   #3
Fabeldyr
Пользователь
 
Аватар для Fabeldyr
 
Регистрация: 25.10.2011
Сообщений: 14
По умолчанию

Mikl___, спасибо за код, однако на строке
Код:
mov [esi], al
вылетает с ошибкой Project project1.exe raised exception
class EAccessViolation with message
'Access violation at address
004023B1 in module 'project1.exe'. Read of address FFFFFF8C'. Process stopped.Use Step or Run to continue.
Fabeldyr вне форума Ответить с цитированием
Старый 26.10.2011, 11:21   #4
Ang15
Пользователь
 
Регистрация: 02.07.2011
Сообщений: 38
По умолчанию

Разрядность регистор разная. Попробуй поставить AX (в AH занеси нули).
...
Косвенная адресация. Не прав я.

Последний раз редактировалось Ang15; 26.10.2011 в 11:25.
Ang15 вне форума Ответить с цитированием
Старый 26.10.2011, 11:50   #5
Fabeldyr
Пользователь
 
Аватар для Fabeldyr
 
Регистрация: 25.10.2011
Сообщений: 14
По умолчанию

то же самое
я так понял, дело в том, что регистр esi - 32 бита, а al/ax - 8/16?
с eax тоже не работает
Fabeldyr вне форума Ответить с цитированием
Старый 27.10.2011, 04:32   #6
Mikl___
Участник клуба
 
Регистрация: 11.01.2010
Сообщений: 1,139
По умолчанию

Fabeldyr
Попробуй заменить esi в mov esi,offset data_, mov [esi],al и inc esi на si
Mikl___ вне форума Ответить с цитированием
Старый 27.10.2011, 09:54   #7
Fabeldyr
Пользователь
 
Аватар для Fabeldyr
 
Регистрация: 25.10.2011
Сообщений: 14
По умолчанию

Цитата:
Сообщение от Mikl___ Посмотреть сообщение
Попробуй заменить esi в mov esi,offset data_, mov [esi],al и inc esi на si
уже пробовал =((
такое ощущение, что компилятор ругается на []. Если написать любой регистр без них - всё работает, правда записывается неправильно, а если их поставить - вылетает с одинаковой ошибкой при любых регистрах

Последний раз редактировалось Fabeldyr; 27.10.2011 в 10:03.
Fabeldyr вне форума Ответить с цитированием
Старый 27.10.2011, 11:25   #8
yuran666666
Форумчанин
 
Аватар для yuran666666
 
Регистрация: 23.04.2009
Сообщений: 346
По умолчанию

Используйте регистр di и команду stosb, а вообще размерность надо указывать mov byte ptr[si],al
Нет, ну правда..
yuran666666 вне форума Ответить с цитированием
Старый 27.10.2011, 15:01   #9
Fabeldyr
Пользователь
 
Аватар для Fabeldyr
 
Регистрация: 25.10.2011
Сообщений: 14
По умолчанию

Цитата:
Сообщение от yuran666666 Посмотреть сообщение
а вообще размерность надо указывать mov byte ptr[si],al
ничего не изменилось
Цитата:
Сообщение от yuran666666 Посмотреть сообщение
Используйте регистр di и команду stosb
спасибо!! теперь всё работает, вот рабочий код, может кому ещё пригодится:
Код:
void __fastcall TForm1::read_buttonClick(TObject *Sender)
{
    int i = 0;
    unsigned char data_[6];
    AnsiString datastr = "";

    asm
    {
        mov al, 0
        lea di, data_

        @@cycle:
        mov dx, 037bh
        out dx, al
        mov ah, al

        mov dx, 037ch
        in al, dx
        stosb

        mov al, ah
        inc al
        cmp al, 6
        jb @@cycle
    }
    for (i = 0; i < 6; i++)
    {
        datastr += IntToStr(i);
        datastr += (" - ");
        datastr += IntToStr(data_[i]);
        Memo1 -> Lines -> Add(datastr);
        datastr = "";
    }
}
Fabeldyr вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Метка в ассемблерной вставке EugenK Общие вопросы C/C++ 12 12.09.2011 13:49
Работа с массивом Aleks2215 Microsoft Office Excel 10 04.11.2010 23:38
Как вызвать функцию в ассемблерной вставке, зная адрес iceman2112 Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 3 04.05.2010 13:38
работа с массивом s2dentishe Помощь студентам 2 12.12.2009 22:35
работа с массивом Андрей.12 Помощь студентам 2 22.10.2009 00:25