Цитата
Предполагаются три последовательности символов mas1, mas2, mas3 (количество символов в каждом массиве более 50). Необходимо обьединить последовательно все массивы и занести в mas4 размерностью в 140 символов. Оставшиеся символы теряются.
вот код в FASM
; FASM
; Предполагается, что перед началом работы адреса массивов и их
; размер занесены в соответсвующие переменные)
; Недостатки:
; 1. Предполагается, что количество элементов в трёх исходных массивах больше количества
; элементов итогового. Иначе ошибка.
; 2. После команды ret переменные mas1, mas2, mas3, mas4 уже не указывают на массивы
mas1 dw ? ;\
mas2 dw ? ;! Указатели на массивы
mas3 dw ? ;!
mas4 dw ? ;/
n1 dw 50 ;\
n2 dw 50 ;! Количество элементов в массивах
n3 dw 50 ;!
n4 dw 140 ;/
; Вариант 1
Merge1:
mov dx, [n4] ;\
add dx, [mas4] ;/ Расчитываем адрес последнего элемента и заносим в регистр DX
mov bx, n1 ; В BX адрес n1
mov di, mas1 ; В DI адрес указателя на первый массив
_loopExt:
mov cx, [bx] ; Заносим в CX количество элементов очередного массива
mov si, [di] ; Заносим в SI адрес очередного массива
_loopInt:
mov al, [si] ; В AL значение очередного элемента очередного массива
push bx
mov bx, [mas4] ;\
mov [bx], al ;/ Копируем его в mas4
pop bx
inc si ;\ Переходим к следующим
inc word[mas4] ;/ элементам массивов
cmp dx, [mas4] ;\ Если все элементы mas4 заполнены
je _exit ;/ - выход
loop _loopInt
add bx, 2 ; В BX адрес количества элементов следующего массива
add di, 2 ; В DI адрес указателя на следующий массив
jmp _loopExt
_exit:
ret
; Вариант 2
Merge:
mov dx, [n4] ;\
add dx, [mas4] ;! Расчитываем адрес последнего элмента и заносим в регистр DX
;
mov cx, [n1] ; загружаем в cx количество элементов первого массива
_loop1:
mov bx, [mas1] ;\ В AX значение очередного
mov al, [bx] ;/ элемента массива
mov bx, [mas4] ;\
mov [bx], al ;/ Копируем его в mas4
inc word[mas1] ;\
inc word[mas4] ;/ Переходим к следющим элементам массивов
cmp [mas4], dx ;\
je _exit2 ;/ Если достигли последнего элемента - выход
loop _loop1
;То же для второго массива
mov cx, [n2]
_loop2:
mov bx, [mas2]
mov al, [bx]
mov bx, [mas4]
mov [bx], al
inc word[mas2]
inc word[mas4]
cmp [mas4], dx
je _exit2
loop _loop2
; То же для третьего массива
mov cx, [n3]
_loop3:
mov bx, [mas3]
mov al, [bx]
mov bx, [mas4]
mov [bx], al
inc word[mas3]
inc word[mas4]
cmp [mas4], dx
je _exit2
loop _loop3
_exit2:
ret