Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Вызвать asm процедуру 
:(
    Опции темы
SergeyZuzic
Дата 31.3.2014, 12:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 4
Регистрация: 17.3.2009

Репутация: нет
Всего: нет



Не получается вызвать Simp_proc. "обнаружена недопустимая адресная привязка"

Код

.model MEDIUM
;экспорторуемые данные
PUBLIC  MMX_proc,Simp_proc,OffsResMmx,OffsResSimp,NumResArray,ElemSize

STACK   SEGMENT PARA stack 'STACK'
        db 400h dup (?)
STACK   ENDS

DATA    SEGMENT PARA USE16 PUBLIC 'DATA'
NumResArray     DW      ?               ;количество элементов в результирующем массиве
ElemSize        DB      0FFh
Result_mmx      DD      40 DUP(?)       ;место в памяти для записи результата вычислений процедуры с командами MMX
Result_simp     DD      40 DUP(?)       ;место в памяти для записи результата вычислений процедуры без команд MMX
OffsResMmx      DW      Result_mmx      ;смещение начала массива Result_mmx
OffsResSimp     DW      Result_simp     ;смещение начала массива Result_simp
count           DW      ?
DATA    ENDS

CODE    SEGMENT
        ASSUME cs:code, ds:data, ss:stack
        .586
        .mmx
;***************************************************************************
;          Процедура вычисления суммы двух векторов с использ. MMX         *
;***************************************************************************
MMX_proc        proc    far
        push    bp
        mov     bp,sp
         ;Возьмем в ecx размер вектора
        mov     si,[bp+6]               ;в si адрес вектора a_vector
        mov     di,[bp+8]               ;в di адрес вектора b_vector
        mov     cx,[bp+10]              ;в cx количество элементов векторов

    ;Поскольку мы обрабатываем по 4 компоненты, разделим кол-во компонент на 4
    shr cx,2
    ;Теперь нужно убедится, что мы захватили все компоненты, если это не так, ecx нужно увеличить на 1
    ;Проверим на кратность 4м
    test cx,3
    je itFull
    ;Увеличим счетчик цикла на 1
    inc cx
itFull:
    ;Обнуляем сумму и регистр mm7
    pxor mm0,mm0
        mov  word ptr [Result_simp+si],0
    movq mm7,mm0
loop2:
    ;Берем 4 компоненты вектора А
    movq mm0,[si]
    ;Берем 4 компоненты вектора B
    movq mm1,[di]
    ;Умножаем параллельно 4 копоненты векторов
    ;Сначала находятся 4 произведения компонентов векторов:
    ; dwmul1=vecA[0]*vecB[0] dwmul2=vecA[1]*vecB[1] dwmul3=vecA[2]*vecB[2] dwmul4=vecA[3]*vecB[3]
    ; Далее складываются первое и второе произведение и третье и четвертое:
    ; dwsum1=dwmul1+dwmul2 dwsum2=dwmul3+dwmul4
    ; Получившиеся результаты умножения записываются в регистр mm0...
    pmaddwd mm0,mm1
    ;... и прибавляются к регистру mm7
    paddd mm7,mm0
    ;Переходим к следующим 4м компонентам
    add si,8
    add di,8
    loop loop2
    ;Берём результат сложения в mm0
    movq mm0,mm7
    ;Сдвигаем побитово вправо логически 32 раза
    psrlq mm7,32
    ;Складываем
    paddd mm7,mm0
    movd ax, mm7
        mov word ptr [Result_simp+si],ax
    ;Завершение использования mmx
    emms
        mov     NumResArray,40          ;результат - число (один элемент массива)
        mov     ElemSize,1              ;размер элемента массива - двойное слово
        pop     bp
        ret     6                       ;выход с очисткой стека
MMX_proc        endp
;*****************************************************************************
;           Процедура вычисления суммы двух векторов без использ. MMX        *
;*****************************************************************************
Simp_proc       proc    far
        push    bp
        mov     bp,sp
        mov     si,[bp+6]
        mov     di,[bp+8]
        mov     cx,[bp+10]

    ;Обнуляем сумму
        mov word ptr [Result_simp+si],0
loop1:
    ;Берем компоненту вектора А
    movsx eax,word ptr [esi]
    ;Берем компоненту вектора B в ebx
    movsx ebx,word ptr [edi]
    ;Перемножаем компоненты edx:eax=eax*ebx 
    mul ebx
    ;Прибавляем результат умножения к сумме (Отбросим старшую часть - edx)
        add word ptr [Result_simp+si],ax
    ;Переходим к следующему компоненту
    add si, 2
    add di, 2
    loop loop1
        mov     NumResArray,40
        mov     ElemSize,1
        pop     bp
        ret     6
Simp_proc       endp

CODE    ENDS
        END
        

PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Asm: Общие вопросы"
MAKCim
  • Проставьте несколько ключевых слов темы, чтобы её можно было легче найти.
  • Не забывайте пользоваться кнопкой КОД.
  • Телепатов на форуме нет! Задавайте чёткий, конкретный и полный вопрос. Указывайте полностью ошибки компилятора и компоновщика.
  • Новое сообщение должно иметь прямое отношение к разделу форума. Флуд, флейм, оффтопик запрещены.
  • Категорически запрещается обсуждение вареза, "кряков", взлома программ и т.д.

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, MAKCim.

 
 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Asm: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.1198 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.