Перейти из форума на сайт.

НовостиФайловые архивы
ПоискАктивные темыТоп лист
ПравилаКто в on-line?
Вход Забыли пароль? Первый раз на этом сайте? Регистрация
Компьютерный форум Ru.Board » Компьютеры » Прикладное программирование » Вставки Assembler в С++

Модерирует : ShIvADeSt

 Версия для печати • ПодписатьсяДобавить в закладки

Открыть новую тему     Написать ответ в эту тему

tomsanek



Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Пользуюсь Borland C++ 5.02. При попытке написания ассемблерной вставки выдаёт :"Error parsing transfer macros" - что - то такое. Чё делать?

Всего записей: 73 | Зарегистр. 10-06-2004 | Отправлено: 20:57 25-02-2005 | Исправлено: tomsanek, 20:58 25-02-2005
OdesitVadim



Advanced Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
а пример можеш привести - как ты вставил код,  где ошибку показывает

Всего записей: 1568 | Зарегистр. 19-09-2003 | Отправлено: 16:53 26-02-2005
tomsanek



Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Вот простой код

Код:
 
asm{
       mov  ax,x
       mov  bx,y
       mov  x,bx
       mov  y,ax
       }
 

Всего записей: 73 | Зарегистр. 10-06-2004 | Отправлено: 21:23 04-03-2005
OdesitVadim



Advanced Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
С критичен к регистру. название регистров нужно кажеться писать большими буковками. А также x и y должны быть совместимы по типу.

Всего записей: 1568 | Зарегистр. 19-09-2003 | Отправлено: 12:23 05-03-2005
cainz



Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Возможно забыл поставить точку с запятой после инструкций?
Но скорее всего у тебя переменные "х" и "у" имеют длинну, отличную от 2-х байт (длинна регистров "ах" и "bх")

Всего записей: 77 | Зарегистр. 31-05-2005 | Отправлено: 10:38 01-06-2005
redp

Full Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
кхе-кхе
наверное так более правильно:

Код:
 
asm{  
mov ax,[x]
mov bx,[y]
mov [x],bx  
mov [y],ax  
}
 


Всего записей: 514 | Зарегистр. 16-06-2003 | Отправлено: 11:07 01-06-2005
OdesitVadim



Advanced Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
redp
на асме да, на асм вставке в Делфе не нужно писать квадратные скобки - компилятор сам справиться. думаю Borland C++ 5.02 не далеко в этом плане ушел.

----------
Press any key to continue or any other key to exit
Пишите так, чтобы не было стыдно за нобелевскую премию.

Всего записей: 1568 | Зарегистр. 19-09-2003 | Отправлено: 11:43 01-06-2005
mr_eoi



Silver Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
OdesitVadim
12:23 05-03-2005
Цитата:
С критичен к регистру. название регистров нужно кажеться писать большими буковками. А также x и y должны быть совместимы по типу.

Си - критичен, а вот встроенному ассемблеру, как правило, всё равно. Критичность Си к большим (малым) символам сказывается на применении регИстровых псевдопеременных (если данная версия Си их поддерживает, например у Борланда: _AX, _BX, _SI, но _es, _ds и т.п.)

----------
Per Aspera Ad Astra...

Всего записей: 2187 | Зарегистр. 10-08-2003 | Отправлено: 12:18 01-06-2005
1lex1

Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Не работают метки в ассемблерной вставке в Visual C++ .net
Код:
__asm
    {
        mov    ecx,    x
        mov    eax,    0
qwe:
        nop
        add    eax,    ecx
        loop    qwe
        loop    qwe
        loop    qwe
        loop    qwe
        mov    y,    eax
    }
С каждой командой loop регистр ecx уменьшается на 1, но переход не происходит. Как сделать метки в ассемблерной вставке?
Заранее спасибо за ответы.

Всего записей: 278 | Зарегистр. 22-11-2013 | Отправлено: 22:18 23-01-2016
ne_viens

Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Почему не происходит? Всё происходит, как и написано- первый loop крутит цикл на qwe: , пока ecx не становится равным 0, второй loop сбрасывает ecx c 0 на 0xffffffff, и опять крутится первый loop, но теперь уже от 0xffffffff, потом снова второй loop, итд.
 
Loop медленная инструкция, её не следует применять, когда важна скорость. Лучше  
sub ecx, 1
jnе qwe

Всего записей: 1530 | Зарегистр. 01-11-2004 | Отправлено: 22:40 23-01-2016
1lex1

Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Заработало, ошибка была моя: задал одинаковое имя для метки и функции, а компилятор не указал на ошибку, сделав только предупреждения, которые скрыты.
 
ne_viens
Цитата:
Loop медленная инструкция
Почему она считается медленнее? По идеи она создавалась для замены двух операций ЦП на одну и должна быть быстрее.

Всего записей: 278 | Зарегистр. 22-11-2013 | Отправлено: 10:10 24-01-2016
ne_viens

Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Она не считается, она есть. Когда она создавалась для 8086 процессора, может и была быстрее.
На современных процессорах loop выполняется за 5 тактов процессора, sub за 0.33, je за 1-2 (если подряд идут независимые однотипные инструкции).
Это не трудно проверить самому:

Код:
 
#include <windows.h>
#include <stdlib.h>
#include <stdio.h>
 
int main()
{
    long long x, y, z;
 
    __rdtsc();
    y = __rdtsc();
    __asm {
        mov ecx, 0xffff
    L1:
        nop
        loop L1
    }
 
    x = __rdtsc();
 
    __asm {
        mov ecx, 0xffff
    L0:
        nop
        sub ecx, 1
        jne L0
    }
    z = __rdtsc();
 
    printf("loop=%lld ticks\nsub =%lld ticks\n", x - y, z - x);
}
 


Всего записей: 1530 | Зарегистр. 01-11-2004 | Отправлено: 13:33 24-01-2016 | Исправлено: ne_viens, 13:34 24-01-2016
Benchmark



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору

Цитата:
Лучше  
sub ecx, 1
jnе qwe  

 
Как вариант:
 
dec ecx
jnz qwe
 
На самом деле подобные оптимизации для i386 и для core i7 дадут разный результат. Многие из инструкций, которые когда-то считались медленными, давно уже стали вполне себе быстрыми.

Всего записей: 6833 | Зарегистр. 01-10-2002 | Отправлено: 20:30 25-01-2016
Открыть новую тему     Написать ответ в эту тему

Компьютерный форум Ru.Board » Компьютеры » Прикладное программирование » Вставки Assembler в С++


Реклама на форуме Ru.Board.

Powered by Ikonboard "v2.1.7b" © 2000 Ikonboard.com
Modified by Ru.B0ard
© Ru.B0ard 2000-2024

BitCoin: 1NGG1chHtUvrtEqjeerQCKDMUi6S6CG4iC

Рейтинг.ru