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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 17.02.2010, 22:13   #11
xVxSeRGxVx
Пользователь
 
Регистрация: 28.09.2009
Сообщений: 42
По умолчанию

ну с асмом я могу согласиться, что я там наковырял, а в Паскале что там непонятного ?
xVxSeRGxVx вне форума Ответить с цитированием
Старый 18.02.2010, 05:59   #12
Mikl___
Участник клуба
 
Регистрация: 11.01.2010
Сообщений: 1,162
По умолчанию

xVxSeRGxVx
и в чем проблема?
Код:
.data 
a db 121, 234, 56, 219, 126
b db 69, 198, 27, 219, 255
res dw 5 dup (?)
.code
mov bx,4; перемножаем с конца массива, индекс на 1 меньше 
;т.к. адресация в массиве начинается с нуля
a1: mov al,a[bx]; в AL очередной элемент из массива A
      mul b[bx]; умножаем на элемент из массива B
      shl bx,1; элементы массива RES занимают в два раза больше места
      mov res[bx],ax; результат умножения в элемент массива RES
      shr bx,1; возвращаем индексу первоначальный размер
      dec bx; переходим к следующему элементу
      jns a1; если прошли не весь массив начинаем с начала
если требуется перемножить числа со знаком -- замени mul на imul
если требуется перемножать не байты а слова, замени AL на AX
dec bx на sub bx,2 и т.д.
Mikl___ вне форума Ответить с цитированием
Старый 18.02.2010, 10:23   #13
xVxSeRGxVx
Пользователь
 
Регистрация: 28.09.2009
Сообщений: 42
По умолчанию

Цитата:
Сообщение от Mikl___ Посмотреть сообщение
xVxSeRGxVx
и в чем проблема?
Код:
.data 
a db 121, 234, 56, 219, 126
b db 69, 198, 27, 219, 255
res dw 5 dup (?)
.code
mov bx,4; перемножаем с конца массива, индекс на 1 меньше 
;т.к. адресация в массиве начинается с нуля
a1: mov al,a[bx]; в AL очередной элемент из массива A
      mul b[bx]; умножаем на элемент из массива B
      shl bx,1; элементы массива RES занимают в два раза больше места
      mov res[bx],ax; результат умножения в элемент массива RES
      shr bx,1; возвращаем индексу первоначальный размер
      dec bx; переходим к следующему элементу
      jns a1; если прошли не весь массив начинаем с начала
если требуется перемножить числа со знаком -- замени mul на imul
если требуется перемножать не байты а слова, замени AL на AX
dec bx на sub bx,2 и т.д.
я это понимаю, проблема в том, что массивы передаются у функцию написанную на АСМ-е с паскаля.
указатель на первый массив я б нахожу вот так
Код:
lds SI, [bp+4]
, после чего по можна брать значения елементов массива с помощью функции
Код:
 lodsw
- тут всё просто, а вот в чем проблема, допустим сдвиг DI по 2-му массиву я запишу в DI:
Код:
lds DI, [bp+8]
а как с нимим ожновременно работать не понимаю хотя можно сделать так:
Код:
lds SI, [bp+4]
lds DI, [bp+8]
MOV CX,5 ; потомучто 5 елементов в массиве
M1:
    lodsw;ЗАГРУЖАЕМ В АХ первый елемент 1-го массива
    MOV BX,[DI];ЗАГРУЖАЕМ В BХ первый елемент 1-го массива
    MUL BX
    ADD DI,2 ;увел. сдвиг на 2 (след. елемент 2-о массива)
LOOP M1
ПРАВДА, я не уверен что программа заработает

Последний раз редактировалось xVxSeRGxVx; 18.02.2010 в 10:28.
xVxSeRGxVx вне форума Ответить с цитированием
Старый 18.02.2010, 10:35   #14
Mikl___
Участник клуба
 
Регистрация: 11.01.2010
Сообщений: 1,162
По умолчанию

Код:
TMas1=array [1..5] of byte;
TMas2=array [1..5] of byte;
res=array [1..5] of word;
asm
mov di,4; перемножаем с конца массива, индекс на 1 меньше 
;т.к. адресация в массиве начинается с нуля
a1: mov al,[bp+4][di]; в AL очередной элемент из массива TMas1
      mul [bp+8][di]; умножаем на элемент из массива TMas2
      shl di,1; элементы массива RES занимают в два раза больше места
      mov [bp+12][di],ax; результат умножения в элемент массива RES
      shr di,1; возвращаем индексу первоначальный размер
      dec di; переходим к следующему элементу
      jns a1; если прошли не весь массив начинаем с начала
end
так понятнее? Если адреса массивов передаются через стек, так и используй их в виде [bp+XX] перемножаешь элементы с одним индексом и он же служит счетчиком вместо CX

Последний раз редактировалось Mikl___; 18.02.2010 в 10:48.
Mikl___ вне форума Ответить с цитированием
Старый 18.02.2010, 10:53   #15
xVxSeRGxVx
Пользователь
 
Регистрация: 28.09.2009
Сообщений: 42
По умолчанию

Цитата:
Сообщение от Mikl___ Посмотреть сообщение
Код:
TMas1=array [1..5] of byte;
TMas2=array [1..5] of byte;
res=array [1..5] of word;
asm
mov di,4; перемножаем с конца массива, индекс на 1 меньше 
;т.к. адресация в массиве начинается с нуля
a1: mov al,[bp+4][di]; в AL очередной элемент из массива TMas1
      mul [bp+8][di]; умножаем на элемент из массива TMas2
      shl di,1; элементы массива RES занимают в два раза больше места
      mov [bp+12][di],ax; результат умножения в элемент массива RES
      shr di,1; возвращаем индексу первоначальный размер
      dec di; переходим к следующему элементу
      jns a1; если прошли не весь массив начинаем с начала
end
так понятнее? Если адреса массивов передаются через стек, так и используй их в виде [bp+XX] перемножаешь элементы с одним индексом и он же служит счетчиком вместо CX
теоретически возможно... на практике попозже проверю... спасибо
xVxSeRGxVx вне форума Ответить с цитированием
Старый 18.02.2010, 23:28   #16
xVxSeRGxVx
Пользователь
 
Регистрация: 28.09.2009
Сообщений: 42
Печаль

ну вот попробывал внедрить код выше представленной идеи, мой паскаль:
Код:
{$L c:\tasm\bin\multipl.obJ}
Program labasrn_3;
uses crt;
Type
TMas1=array [1..5] of integer;
TMas2=array [1..5] of integer;
Var Mas1 , Mas2 :TMAS1;
    MasRes:TMas2;
i,res,a,b : integer;
function multipl(var MasRes:TMas2; Mas1, Mas2:TMas1):integer;external;
Procedure Vvod ;
Begin
TextColor(Red);
Writeln;
TextColor(2);
Writeln('5 eleM Mac inp!');
TextColor(yellow) ;
For i:=1 to 5 do
Begin
Mas1[i]:=random(5);
Writeln('Mas1[',i,']=',Mas1[i]);
End;
For i:=1 to 5 do
Begin
TextColor(4);
Mas2[i]:= random(16);
Writeln('Mas2[',i,']=',Mas2[i]);
End;

Readln;
End;

BEGIN {Main}
ClrScr;
Vvod;
multipl(MasRes, Mas1, Mas2);
TextColor(Blue);
for i:=1 to 5 do
begin
Writeln('MasRes[',i,']=',MasRes[i]);
end;
Readln;
END.
обратите внимание, как я передаю параметры у функцию multipl, поскольку это очень важно...
моя функция в ассемблере( файл multipl.asm):
Код:
ideal
segment CODE byte public
	assume cs:CODE
	public multipl
	arr_ptr1 equ 8
	arr_ptr2 equ 4
	push bp
	push ds
	push cx
	push bx
	push dx


proc multipl
	push bp
	mov bp, sp
	
	mov di, 4		

a1: mov ax,[bp+4][di]	
      mul [bp+8][di]		
      shl di,1			
      mov [bp+12][di],ax
      shr di,1			
      dec di			
      jns a1			

	pop bp
	ret 4
endp multipl 

	pop dx
	pop bx
	pop cx
	pop ds
	
ends Code
end
кстати я не понял вот этот момент: [bp+4][di] - это двухмерный массив что-ли? я первыйраз стикаюсь с таким...

о, и у меня tasm.exe ругается :

Последний раз редактировалось xVxSeRGxVx; 18.02.2010 в 23:33. Причина: добавил фотографию
xVxSeRGxVx вне форума Ответить с цитированием
Старый 19.02.2010, 00:48   #17
xVxSeRGxVx
Пользователь
 
Регистрация: 28.09.2009
Сообщений: 42
По умолчанию

вот ещё одна версия функции на АСМ-е:
Код:
ideal
segment CODE byte public
	assume cs:CODE
	public multipl
	arr_ptr1 equ 8
	arr_ptr2 equ 4
	arr_ptr3 equ 12
	push bp
	push ds
	push cx
	push bx
	push dx


proc multipl
	push bp
	mov bp, sp
	mov bx, [bp+arr_ptr1]
mov DI, arr_ptr1
MOV CX, 5

PUSH DI
PUSH CX

M1: 
	MOV AX, [BX]
	MOV DS:[DI], AX
	ADD DI, 2
	ADD BX, 2
LOOP M1

POP CX
POP DI

mov SI, arr_ptr2
M2:
	LODSW
	MUL DS:[DI] ;не уверен можно ли так писать
	MOV [BP+arr_ptr3], AX
	ADD DI, 2
LOOP M2

	pop bp
	ret 4
endp multipl 

	pop dx
	pop bx
	pop cx
	pop ds
	
ends Code
end
правда не знаю можно ли так писать, и она не работает, возвращает только нули
xVxSeRGxVx вне форума Ответить с цитированием
Старый 19.02.2010, 00:51   #18
Doholyan
Форумчанин
 
Регистрация: 26.04.2009
Сообщений: 270
По умолчанию

xVxSeRGxVx
function multipl(Mas1 , Mas2:TMas1):integer;external;
Procedure Vvod ;

вот то что меня поставило в тупик....
поясни пожайлуста эти строчки....
Doholyan вне форума Ответить с цитированием
Старый 19.02.2010, 01:02   #19
xVxSeRGxVx
Пользователь
 
Регистрация: 28.09.2009
Сообщений: 42
По умолчанию

Цитата:
Сообщение от Doholyan Посмотреть сообщение
xVxSeRGxVx
function multipl(Mas1 , Mas2:TMas1):integer;external;
Procedure Vvod ;

вот то что меня поставило в тупик....
поясни пожайлуста эти строчки....


ой... а где это... в предыдущем примере с Паскаля написано:
Код:
function multipl(var MasRes:TMas2; Mas1,Mas2:TMas1):integer;external;
а вызывается функция так:
Код:
multipl(MasRes, Mas1, Mas2);
то наверно я опечатку сделал раньше (sorry)

Последний раз редактировалось xVxSeRGxVx; 19.02.2010 в 01:14. Причина: добавил цытирование
xVxSeRGxVx вне форума Ответить с цитированием
Старый 20.02.2010, 11:40   #20
Doholyan
Форумчанин
 
Регистрация: 26.04.2009
Сообщений: 270
По умолчанию

xVxSeRGxVx
Да, это было в Паскале написанно...
function multipl(Mas1 , Mas2:TMas1):integer;external;
Procedure Vvod ;
Помню как вызываються функции, обьясни именно вторую строчку!
Doholyan вне форума Ответить с цитированием
Ответ


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

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Паскаль.Обработка двумерных массивов. popozoglo Помощь студентам 2 12.02.2010 01:33
Паскаль.Обработка одномерных массивов. popozoglo Помощь студентам 2 11.02.2010 22:49
Паскаль: Операции с элементами массивов. iolopukki Помощь студентам 1 23.06.2009 19:54
Паскаль,формирование массивов. Amenus Помощь студентам 4 10.03.2009 20:33
Паскаль. Помогиет с умножением массивов set Помощь студентам 2 20.11.2007 14:49