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

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

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

 Версия для печати • ПодписатьсяДобавить в закладки
Страницы: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133

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

ShIvADeSt



Moderator
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Обсуждаются все вопросы, связанные с программированием на Ассемблере как общего так и конкретного характера.
 
важное примечание
для тех кто считает, что здесь место халявных исполнений курсовых и лабораторных работ.
тут обычно помогают тем, кто сам хоть что-то пытается понять и сделать, но что-то не понимает, что-то не получается...
ведь ассемблер изучают и задачки на нём дают обычно не менеджерам по продажам и даже не всем физ.-мат. специальностям
вы сами избрали этот путь? вот и идите по нему сами, ножками... с ручками и с головой...
 
короче, тут не сборище придурков-альтруистов, которым нечего делать и они ждут-не дождутся когда вы их попросите
что-то сделать _за_ вас
если позарез надо и вы даже готовы заплатить, тогда вам сюда
удачи
 
некоторые ресурсы
http://www.wasm.ru/ Самый популярный русскоязычный ресурс. https://wasm.in/
Ассемблер - книги (ASM, Assembler)
 
Просьба все большие листинги оформлять тегом more.
 
если вам вдруг не отвечают или ответ вас не устраивает
и вообще полезно прочитать всем спрашивающим

Всего записей: 3956 | Зарегистр. 29-07-2003 | Отправлено: 01:42 29-11-2006 | Исправлено: akaGM, 17:44 11-06-2020
MERCURY127



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

Цитата:
это недопустимо!  

ну так я ж лично себе, чтоб паскаль не пытать...
и ведь хоть бы какой отладчик норм поиметь, чтоб эти xyzmm показывал...
а то все приходится скилл телепатии прокачивать... что то не очень с этими параллельным регистрами получается... трудновообразимые они, однако

Всего записей: 11540 | Зарегистр. 03-08-2008 | Отправлено: 17:59 26-12-2012
akaGM

Platinum Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
MERCURY127
 
да ладно тебе, без смайла уже и шутка -- не шутка?
просто кому-то дают онанистические задачи, и эти кто-то пытаются решить эти задачи нашими руками :)
 
борландОвский вроде показывает...
всё равно компилятор лучше сделает...
я попытался на интел-фортране забабахать, так он мне эти 8 циклов просто-напросто раскрыл...
правда у меня и проц не "SS-тришный"...

Всего записей: 24056 | Зарегистр. 06-12-2002 | Отправлено: 18:23 26-12-2012
MERCURY127



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

Цитата:
да ладно тебе, без смайла уже и шутка -- не шутка?  

до оно то как раз понятно
но мне самому интересно стало... видимо проще переписать всю эту ассемблерную врезку
да и вообще - нафиг нужна эта "оптимизация"? все равно два цикла получаются, что само по себе далеко не оптимально...

Всего записей: 11540 | Зарегистр. 03-08-2008 | Отправлено: 18:48 26-12-2012
ne_viens

Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
phaddd можно сдвигом+суммой заменить как-то так:
 
.code
start:
 
    push ebx
    mov ebx, 8
    lea edx, matrix ;16 aligned
    lea ecx, vector ;16 aligned
    lea eax, result ;16 aligned
align 16
L1:
    movq mm0, [edx]
    movq mm1, [edx+8]
 
    pmaddwd mm0, [ecx]
    pmaddwd mm1, [ecx+8]
 
;    phaddd mm0, mm1  
    paddd mm0, mm1
    movq mm1, mm0
    psrlq mm0, 32
    paddd mm0, mm1
 
    movd dword ptr[eax], mm0
    add edx, 10h
    add eax, 4
    dec ebx
    jne L1
 
    pop ebx
    invoke ExitProcess, 0
END start

Всего записей: 1525 | Зарегистр. 01-11-2004 | Отправлено: 19:34 26-12-2012 | Исправлено: ne_viens, 19:44 26-12-2012
cp58

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

Цитата:
был бы очень признателен если кто-нибудь помог переписать ее под SSE1 инструкции.

Вы уверены что именно SSE1?

Цитата:
ассемблерная вставка в ней написана с использованием SSE3 инструкций;  

Тут и SSSE3 присутствует.
 
Перевести на SSE1 можно несколькими способами. Можно, например, перевести целочисленный тип в тип с плавающей запятой и использовать доступные инструкции, вроде mulps, addps или mulss, addss для скалярных операций; а ниже показан код, использующий операции для целочисленных данных. Работает для матриц с небольшим значением элементов, чтобы работало с большими необходимо произвести считывание поэлементно, вместо операции psadbw, также если размерность вектора будет отличаться от 8, то необходимо добавить второй цикл.

Код:
__asm__ volatile
    (    
        "pinsrw $0, (%1), %%xmm2\n\t"
        "pinsrw $1, 2(%1), %%xmm2\n\t"
        "pinsrw $2, 4(%1), %%xmm2\n\t"
                "pinsrw $3, 6(%1), %%xmm2\n\t"
        "pinsrw $4, 8(%1), %%xmm2\n\t"
                "pinsrw $5, 10(%1), %%xmm2\n\t"
        "pinsrw $6, 12(%1), %%xmm2\n\t"
                "pinsrw $7, 14(%1), %%xmm2\n\t"
        "pxor %%xmm1, %%xmm1\n\t"
        "movl %2, %%ecx\n\t"
        "b:\n\t"
        "xorl %%edx, %%edx\n\t"
        "pxor %%xmm0, %%xmm0\n\t"
        "pinsrw $0, (%0), %%xmm0\n\t"
        "pinsrw $1, 2(%0), %%xmm0\n\t"
        "pinsrw $2, 4(%0), %%xmm0\n\t"
        "pinsrw $3, 6(%0), %%xmm0\n\t"
        "pinsrw $4, 8(%0), %%xmm0\n\t"
        "pinsrw $5, 10(%0), %%xmm0\n\t"
        "pinsrw $6, 12(%0), %%xmm0\n\t"
        "pinsrw $7, 14(%0), %%xmm0\n\t"
        "pmullw %%xmm2, %%xmm0\n\t"
        "psadbw %%xmm1, %%xmm0\n\t"
        "pextrw $0, %%xmm0, %%eax\n\t"
        "addl %%eax, %%edx\n\t"
        "pextrw $4, %%xmm0, %%eax\n\t"
        "addl %%eax, %%edx\n\t"
        "movl %%edx, (%3)\n\t"
        "addl $0x10, %0\n\t"
        "addl $4, %3\n\t"
        "dec %%ecx\n\t"
        "test %%ecx, %%ecx\n\t"
        "jne b\n\t"
        :
        :"D"(mx),"S"(v),"i"(m),"r"(e)
        :"eax", "edx", "ecx", "xmm0", "xmm1", "xmm2"
    );
 

 
P.S. Так все таки матрицу на вектор или вектор на матрицу?
 
ne_viens
Это SSE2.

Всего записей: 295 | Зарегистр. 06-12-2011 | Отправлено: 20:26 26-12-2012 | Исправлено: cp58, 20:28 26-12-2012
svch0st

Newbie
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
помогите пожалуйста решить задачу:
 
реализовать на встроенном ассемблере для 32-х разрядных
 исполнительных адресов эквивалент следующего расчетного выражения
 
 
short Y[150][600];
short p,q;
short *pm;
s s6;
short w;
int i,j;
struct s{
char d[12];
float r;
short g;
};
w = s6.g + p*q - pm[j]/Y[i][j];
 
 
 
возможно исходый код вот такой:
      
short Y[150][600];      struct s{
short p,q;                      char d[12];
short *pm;                      float r;
s s6;                           short g;
short w;                };
int i,j;
 
w = s6.g + p*q - pm[j]/Y[i][j];
 
 
 
в книге написано так а копируется как в первом варианте

Всего записей: 1 | Зарегистр. 06-01-2013 | Отправлено: 10:47 06-01-2013
MERCURY127



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

Всего записей: 11540 | Зарегистр. 03-08-2008 | Отправлено: 19:44 06-01-2013 | Исправлено: MERCURY127, 19:45 06-01-2013
vjick

Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Установил Microsoft Visual Studio 2010 Ultimate. Создаю новый проект Win32 - console application. В Source добавляю .asm файл... на этой стадии судя по руководствам должен спросить чем компилировать.. однако ничего не появляется и при попытке компиляции выбивает ошибку. Подскажите, как быть?

Всего записей: 1809 | Зарегистр. 29-01-2002 | Отправлено: 22:20 05-03-2013
bomzzz



Platinum Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
masm32 поставить вместо этого уродца студийного
http://www.masm32.com/

Всего записей: 13343 | Зарегистр. 13-01-2008 | Отправлено: 22:21 05-03-2013
vjick

Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
а других вариантов решения нету?..

Всего записей: 1809 | Зарегистр. 29-01-2002 | Отправлено: 22:23 05-03-2013
bomzzz



Platinum Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
ну есть наверняка, только для асма в студии нет инклудов, если ты там чтото глобальное затеял на ассемблере ваять, то без инклудов у тебя будет в несколько раз больше работы. придется значение самых простых переменных искать в мсдне. основные инклуды с переменными в масме весят два мегабайта и они далеко не полные

Всего записей: 13343 | Зарегистр. 13-01-2008 | Отправлено: 22:39 05-03-2013 | Исправлено: bomzzz, 22:40 05-03-2013
vjick

Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
человеку помочь задачу решить. ничего глобального. раньше точно помнюю что в VS2010 нормально все получалось... толи забыо что-то, то ли перепутал
 
Добавлено:
bomzzz
а как masm этот ставить? скачал, запускаю. раз 5 ОК нажимаю и в итоге никуда программа не устанавливается. епсель мопсель

Всего записей: 1809 | Зарегистр. 29-01-2002 | Отправлено: 22:43 05-03-2013
ne_viens

Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
И в C:\MASM32\ тоже?

Всего записей: 1525 | Зарегистр. 01-11-2004 | Отправлено: 11:37 06-03-2013
vjick

Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Поставил 2008 VS. Все ок.
Всем спасибо.
С MASM тоже разобрался ради общего развития.

Всего записей: 1809 | Зарегистр. 29-01-2002 | Отправлено: 00:20 07-03-2013
inf158704

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

Код:
 
// ndis
VOID NdisInitializeString(PNDIS_STRING destination, PUCHAR source)
    {                            // NdisInitializeString
 
// Exported entry 136. NdisInitializeString
// Attributes: bp-based frame
// __stdcall NdisInitializeString(x, x)
 
//public _NdisInitializeString@8
//_NdisInitializeString@8    proc near
 
 
    _asm  
        {
arg_0 = dword ptr 8
arg_4 = dword ptr 0Ch
 
mov    edi, edi
push    ebp
mov    ebp, esp
push    edi
mov    edi, [ebp+arg_4]
mov    eax, edi
lea    ecx, [eax+1]
 
loc_128C3:
mov    dl, [eax]
inc    eax
test    dl, dl
jnz    short loc_128C3
push    esi
mov    esi, [ebp+arg_0]
sub    eax, ecx
add    eax, eax
mov    [esi], ax
add    eax, 2
mov    [esi+2], ax
movzx    eax, ax
push    7473444Eh
push    eax
push    0
 
call    ExAllocatePoolWithTag
//call    ds:__imp__ExAllocatePoolWithTag@12 ; ExAllocatePoolWithTag(x,x,x)
 
test    eax, eax
mov    [esi+4], eax
pop    esi
jz    short loc_1290B
 
loc_128F5:
mov    cl, [edi]
test    cl, cl
jz    short loc_12907
movzx    cx, cl
mov    [eax], cx
inc    edi
inc    eax
inc    eax
jmp    short loc_128F5
 
loc_12907:
and    word ptr [eax],    0
 
loc_1290B:
pop    edi
pop    ebp
retn    8
//_NdisInitializeString@8    endp
        }
    }                            // NdisInitializeString
 

 
пытаюсь откомпилировать эту вставку асемблерную в С++ выдраннуюс помощь иды
дает 2 ошибки error C2400: inline assembler syntax error in 'opcode'; found 'bad token'
на:
arg_0 = dword ptr 8
arg_4 = dword ptr 0Ch
подскажите пожалуста где делаю ошибку
еще смущает эта строка  
call    ExAllocatePoolWithTag - это вызов фукции уровня ядра, верно я ее вызываю? или нужно аналогично как ниже?
VxDCall(IFSMgr_Ring0_FileIO)
VMMCall(Test_Debug_Installed)

Всего записей: 921 | Зарегистр. 21-08-2011 | Отправлено: 14:20 07-03-2013 | Исправлено: inf158704, 14:22 07-03-2013
bomzzz



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

Цитата:
arg_0 = dword ptr 8
arg_4 = dword ptr 0Ch  

 
тут врядли имеется ввиду dword ptr[8], тут скорее всего имеется ввиду адреса относительно командной строки
 
наверно проще переписать это все на нормальный ассемблер

Всего записей: 13343 | Зарегистр. 13-01-2008 | Отправлено: 15:08 07-03-2013
inf158704

Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
беда в том что из меня програмист никакой, в  лудшем случае по аналогии чтото могу поменять...
по задумке у меня не только одна эта асемблерная вставка должна быть...
поподробнне можно насчет адреса? хотябы примерчик какойто
 
//mov    esi, [ebp+arg_0]
...
mov    esi, [ebp+3]
заменяю аргументы просто на значения в принципе компилируеться...
 
правда была еще ошибка для проверки тоже закоментировал
//mov    ebp, esp
//pop    ebp
чем ему ebp ненравиться может? и всетаки почему аргументы непринимает
 

Всего записей: 921 | Зарегистр. 21-08-2011 | Отправлено: 15:22 07-03-2013 | Исправлено: inf158704, 15:33 07-03-2013
ne_viens

Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Это не самое лучшее решение- делать инлайн, так как компилятор выключает оптимизацию а под win64 инлайн вообще недоступен.
Лучше собирать куски asm кода в lib при помощи MASMа и потом линковать прогу с lib. Или сразу в уме (или при помощи Hexrays) на C переводить.
 
 
__stdcall NdisInitializeString(PNDIS_STRING destination, PUCHAR source)
    {                            // NdisInitializeString
 
// Exported entry 136. NdisInitializeString
// Attributes: bp-based frame
// __stdcall NdisInitializeString(x, x)
 
//public _NdisInitializeString@8
//_NdisInitializeString@8    proc near
 
 
    _asm  
        {
;arg_0 = dword ptr 8
;arg_4 = dword ptr 0Ch  
 
;mov    edi, edi
;push    ebp
;mov    ebp, esp
;push    edi
mov    edi, source
mov    eax, edi
lea    ecx, [eax+1]
 
loc_128C3:
mov    dl, [eax]
inc    eax
test    dl, dl
jnz    short loc_128C3
;push    esi
mov    esi, destination
sub    eax, ecx
add    eax, eax
mov    [esi], ax
add    eax, 2
mov    [esi+2], ax
movzx    eax, ax
push    7473444Eh
push    eax
push    0
 
call    ExAllocatePoolWithTag
//call    ds:__imp__ExAllocatePoolWithTag@12 ; ExAllocatePoolWithTag(x,x,x)
 
test    eax, eax
mov    [esi+4], eax
;pop    esi
jz    short loc_1290B
 
loc_128F5:
mov    cl, [edi]
test    cl, cl
jz    short loc_12907
movzx    cx, cl
mov    [eax], cx
inc    edi
inc    eax
inc    eax
jmp    short loc_128F5
 
loc_12907:
and    word ptr [eax],    0
 
loc_1290B:
;pop    edi
;pop    ebp
;retn    8
//_NdisInitializeString@8    endp
        }
    }                            // NdisInitializeString

Всего записей: 1525 | Зарегистр. 01-11-2004 | Отправлено: 17:27 07-03-2013
bomzzz



Platinum Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
а че эта вставка вообще делает, может проще просто написать с нуля?

Всего записей: 13343 | Зарегистр. 13-01-2008 | Отправлено: 18:24 07-03-2013
inf158704

Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
самое оптимальное решение это именно асемблерная вставка
обясню почему:
1. я пока 0 и в асемблере и в си,  
2. это фунция ядра, в ХР она есть, оттуда я ее и вытащил...  таких фунций мне нужно минимм еще штуки четыре.
3. на даном этапе мне чесно скажу безразницы что она делает имено интересует способы вставки и все.
4. ковыряюсь в чужом коде на СИ, 99 процентов коророго я непонимаю и думаю никогда неразберусь, но 1 процента мне достаточно, в этом 1 проценте полгода разбирался.
х64 тоже ненужен
всетаки подскажите имено где ошибка при определении констант как понимаю
arg_0 = dword ptr 8  
arg_4 = dword ptr 0Ch  
это именно константы... они должны хранится в область кода или данных?  может имено это я неучитываю? хотя в принципе ида их из одласти кода и взяла
способ вставки отдельным файлом конечно интересен... былобы проще вставлять... но сейчас главное имено разобраться почему непринимает константы и чем ему регистр ebp немил
с call    ExAllocatePoolWithTag разобрался все верно принимает именно так, хоть и странно
 

Цитата:
 Лучше собирать куски asm кода в lib при помощи MASM  

чем мне может помоч этот способ?

Всего записей: 921 | Зарегистр. 21-08-2011 | Отправлено: 22:38 07-03-2013 | Исправлено: inf158704, 22:41 07-03-2013
Открыть новую тему     Написать ответ в эту тему

Страницы: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133

Компьютерный форум 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