Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Asm для начинающих > [macro] Поэлементное умножение двух массивов


Автор: Vandalko 11.5.2009, 01:07
Наверное, плохо искал, но нашел очень мало на тему создания собственных макросредств  в ассемблере.
Суть задачи - написать макро, чтобы можно было умножать поэлементно 2 массива, эти массивы могут быть из байт, слов, двойных слов. Умножение должно выполняться либо знаковое, либо беззнаковое.
Скажем так, с умножением байтовых массивов проблем нет, но как в третий результирующий массив записывать результат умножения каждой пары элементов из массивов слов или двойных слов ? (некоторое представление у меня даже об этом есть, но хотелось бы проверить его правильность и уточнить некоторые моменты smile )
Но вот главная проблема - знаковое или беззнаковое умножение.
Читал, что можно используя & подставлять значения переменных по типу: 
Код

"Вывод &message"
 или 
Код

var_a_&type d&type 10 dup (?) 
.    
Но как это применить когда нужно в зависимости от условия использовать mul или imul ? Или все же будет проще воспользоваться простым переходом по условию ? smile 

Автор: Vandalko 25.5.2009, 21:13
Програма написана, но есть ошибки...

Код
.386
mmul macro m1,m2,dest,len,znak,o_type
local bmul,wmul,dmul,bznak,wznak,dznak
push ebx
push eax
push edx
push esi
push cx
xor eax,eax
xor edx,edx
xor esi,esi
xor ebx,ebx
mov cx,len
mov bx,znak
mov al,o_type
mov esi,0
cmp al,'b'
je bmul
cmp al,'w'
je wmul
cmp al,'d'
je dmul
bmul:mov al,m1[esi]
cmp bx,'1'
je bznak
mul m2[esi]
bznak:imul m2[esi]
mov dest[2*esi],ax
inc esi
loop bmul
jmp mend 
wmul:mov ax,word ptr m1[2*esi]
cmp bx,'1'
je wznak
mul word ptr m2[2*esi]
wznak:imul word ptr m2[2*esi]
mov dest[4*esi],dx:ax
inc esi
loop wmul
jmp mend 
dmul:mov eax,dword ptr m1[4*esi]
cmp bx,'1'
je dznak
mul dword ptr m2[4*esi]
dznak:imul dword ptr m2[4*esi]
mov dest[8*esi],edx:eax
inc esi
loop dmul
mend:pop ebx
pop eax
pop edx
pop esi
pop cx
endm

data_init macro
mov ax,data
mov ds,ax
xor ax,ax
endm

exit macro
mov ax,4c00h
int 21h
endm

assume CS:CODE, DS:DATA, SS:STACK
DATA segment use16
lngth equ 5
mas_a db -1,8,3,2,-5
mas_b db 1,2,-3,4,5
mas_c dw lngth dup (0)
DATA ends

STACK segment
db 256 dup("?")
STACK ends

CODE segment use16
run:
data_init
mmul mas_a,mas_b,mas_c,lngth,'0','b'
exit
CODE ends
end run



Ошибки:
Цитата
 Assembling: \masm32\my\lab7\lab.asm
\masm32\my\lab7\lab.asm(82) : error A2032: invalid use of register
 mmul(35): Macro Called From
  \masm32\my\lab7\lab.asm(82): Main Line Code
\masm32\my\lab7\lab.asm(82) : error A2032: invalid use of register
 mmul(44): Macro Called From
  \masm32\my\lab7\lab.asm(82): Main Line Code
_


Помогите исправить  smile 

Автор: airyashov 26.5.2009, 22:55
может отстал от masm'a но такую запись вижу первый раз

mov dest[4*esi],dx:ax
mov dest[8*esi],edx:eax

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)