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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 23.10.2011, 23:25   #1
Bezlikiy
Новичок
Джуниор
 
Регистрация: 23.10.2011
Сообщений: 1
Печаль Assembler,смешанное программирование,смешать два массива \

доброй ночи,у меня загвоздка с кодом для ассемблерной проге с таким условие:
объединить 2 массива в 3 так,что бы попарно в новом массиве шли 2 элемента первого массива,потом 2 элемента второго массива,потом 3 и 4 элементы первого и т.д. массивы по 6 элементов,выходной следовательно 12
основная программа пишется на паскале,функция смешивания на Ассемблере,вот что я смог сделать:
Код:
const n = 6;
type t_mas = array [1..n] of Integer;
res_mas = array [1..2*n] of Integer;
var
mas1, mas2 : t_mas;
result_mas : res_mas;
i : Integer;

{$L c:\TTasm\bin\OS2.obj}
procedure insert_mas(var m1, m2 : t_mas; length : Integer; result : res_mas); external;
 
begin
randomize;
for i:=1 to n do
begin
   mas1[i] := random(20);
   mas2[i] := random(50)+50;
end;
 
for i:=1 to n do
    write(mas1[i], ' ');
writeln;
for i:=1 to n do
    write(mas2[i], ' ');
writeln;
insert_mas(mas1, mas2, n, result_mas);
writeln('Result:');
for i:=1 to 2*n do
    write(result_mas[i], ' ');
readln;
end.
Код:
.386
public       insert_mas
m1      equ     [bp+14]
m2      equ     [bp+10]
n       equ     [bp+8]
m_res   equ     [bp+4]

code    segment use16
assume  cs:code
insert_mas      proc    near
      .....

        pop     bp
        ret     10
insert_mas      endp
code   ends
end

помогите написать функцию смешивания(( я в асме профан...но тот код что есть,рабочий,проверял на простом выводе подряд 1 и 2 массивов в 3
П.С.я через команд строку создавал OS2.obj файл как tasm OS2.asm /mx
буду неимоверно признателен за любую помощь)

Последний раз редактировалось Stilet; 24.10.2011 в 08:27.
Bezlikiy вне форума Ответить с цитированием
Старый 24.10.2011, 14:50   #2
Karpinsky
Подтвердите свой е-майл
 
Регистрация: 19.10.2011
Сообщений: 28
По умолчанию

Ну, к примеру, вот так:
Код:
.model large, pascal
.code
public insert_mas

; зачем заморачиваться с вытягиванием аргументов
; из стека вручную, если TASM при указании соглашения
; PASCAL корректно может сделать это сам?

; Заодно перечислим, какие регистры надо сохранить
; при входе, и восстановить при выходе.
; Кстати, высчитывать, как вернуться из процедуры
; (в смысле, каким должен быть параметр ret) при таком
; описании параметров тоже не нужно, TASM сделает это
; самостоятельно.
; И сохранить/восстановить стек тоже не забудет

insert_mas proc far uses es di si ax bx cx dx, m1:dword, m2:dword, n:word, m_res:dword

	les bx, m1	; BX <- текущий адрес в m1
	les si, m2	; SI <- текущий адрес в m2
	les di, m_res	; DI <- куда будем записывать
	
	xor dl, dl	; если DL = 0, то работаем с первым массивом, иначе - со вторым

	; главный цикл
	mov cx, n
loop_1:

	; поскольку надо копировать по 2 значения
	; из каждого массива, я это тоже сделал в цикле
	push cx
	mov cx, 2
inner_loop:
	test dl, 0FFh
	jz first_arr
	
	; копируем элемент из второго массива (SI)
	mov ax, word ptr es:[si]
	add si, 2
	jmp make_copy
	
first_arr:
	; копируем элемент из первого массива (BX)
	mov ax, word ptr es:[bx]
	add bx, 2
	
make_copy:
	; переносим скопированный элемент в массив-результат
	mov word ptr es:[di], ax
	add di, 2
	loop inner_loop
	
	not dl	; переключаемся на другой массив
	pop cx
	loop loop_1
	
	; всё, концерт окончен, можно уходить
	ret
insert_mas endp
end
Karpinsky вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Assembler, два задания DimR Фриланс 2 01.05.2011 19:21
Два одномерных массива A и B. Сформировать два новых массива. Паскаль. Где ошибка в коде? Tomny Помощь студентам 1 27.03.2011 16:47
Даны два массива x[1] <= ... <= x[k], y[1] <= ... <= y[l]. eduDo Общие вопросы .NET 0 15.12.2010 17:00
два массива Blond_89 Помощь студентам 3 25.03.2010 17:52
Язык низкоуровневое программирование Assembler jackpatriot Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 1 03.01.2009 19:05