Версия для печати темы

Нажмите сюда для просмотра этой темы в обычном формате

Форум «Всё о Паскале» _ Ассемблер _ перевод из Fasm в Tasm

Автор: leahov 4.12.2008 14:10

только начал изучать ассемблер, столкнулся с такой проблемой, есть код в fasm, компилятор ругается и выдает ошибки (компилятор tasm). помогите перевести код чтоб tasm его понял

Цитата
Предполагаются три последовательности символов 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

Автор: volvo 4.12.2008 14:32

Все нормально компилируется TASM-ом... Только добавь

.model small
.data

; Здесь твои данные

.code

proc mergeproc

; тут твоя процедура (или одна или другая)

mergeproc endp

start:

; ну, и сама основная программа, вызывать-то процедуру надо?
; ...

mov ax, 4ch
int 21h ; выходим
end start


Автор: leahov 4.12.2008 14:51

может я что то не то сделал, но вот листинг того что получилось


Turbo Assembler Version 4.1 04/12/08 09:44:32 Page 1
1.asm
1 0000 .model small
2 0000 .data
3
4 0000 ???? mas1 dw ? ;\
5 0002 ???? mas2 dw ? ;! Указатели на массивы
6 0004 ???? mas3 dw ? ;!
7 0006 ???? mas4 dw ? ;/
8 0008 0032 n1 dw 50 ;\
9 000A 0032 n2 dw 50 ;! Количество элементов в массивах
10 000C 0032 n3 dw 50 ;!
11 000E 008C n4 dw 140 ;/
12
13
14 0010 .code
15
16 proc mergeproc
**Error** 1.asm(16) Name must come first
17 0000 Merge:
18 0000 8B 16 000Er mov dx, [n4] ;\
19 0004 03 16 0006r add dx, [mas4] ;! Расчитываем адрес последнего элмента и заносим в регистр DX
20 ;
21 0008 8B 0E 0008r mov cx, [n1] ; загружаем в cx количество элементов первого массива
22 000C _loop1:
23 000C 8B 1E 0000r mov bx, [mas1] ;\ В AX значение очередного
24 0010 8A 07 mov al, [bx] ;/ элемента массива
25 0012 8B 1E 0006r mov bx, [mas4] ;\
26 0016 88 07 mov [bx], al ;/ Копируем его в mas4
27 0018 FF 06 0002r inc word[mas1] ;\
28 001C FF 06 0008r inc word[mas4] ;/ Переходим к следющим элементам массивов
29 0020 39 16 0006r cmp [mas4], dx ;\
30 0024 74 42 je _exit2 ;/ Если достигли последнего элемента - выход
31 0026 E2 E4 loop _loop1
32 ;То же для второго массива
33 0028 8B 0E 000Ar mov cx, [n2]
34 002C _loop2:
35 002C 8B 1E 0002r mov bx, [mas2]
36 0030 8A 07 mov al, [bx]
37 0032 8B 1E 0006r mov bx, [mas4]
38 0036 88 07 mov [bx], al
39 0038 FF 06 0004r inc word[mas2]
40 003C FF 06 0008r inc word[mas4]
41 0040 39 16 0006r cmp [mas4], dx
42 0044 74 22 je _exit2
43 0046 E2 E4 loop _loop2
44 ; То же для третьего массива
45 0048 8B 0E 000Cr mov cx, [n3]
46 004C _loop3:
47 004C 8B 1E 0004r mov bx, [mas3]
48 0050 8A 07 mov al, [bx]
49 0052 8B 1E 0006r mov bx, [mas4]
50 0056 88 07 mov [bx], al
51 0058 FF 06 0006r inc word[mas3]
52 005C FF 06 0008r inc word[mas4]
53 0060 39 16 0006r cmp [mas4], dx
54 0064 74 02 je _exit2
55 0066 E2 E4 loop _loop3
56 0068 _exit2:
57 0068 C3 ret
58 0069 start:
59 0069 B8 004C mov ax, 4ch
60 006C CD 21 int 21h ; выходим
61 end start


я понимаю что наверное какую то глупость сделал, подскажите пожалуйста в каком направлении искать

Автор: volvo 4.12.2008 16:11

Я же написал mergeproc proc, а не наоборот... И после ret добавь endp...

+ после метки start добавь выделение памяти под массивы, заполни массивы данными, и занеси адреса в переменные mas1, mas2, mas3 и mas4... То есть, сделай то, о чем говорится в первом комментарии приведенной тобой программы.