IPB
ЛогинПароль:

> ПРАВИЛА РАЗДЕЛА!!!

1. Заголовок или название темы должно быть информативным
2. Все тексты программ должны помещаться в теги [CODE=asm] [/CODE]
3. Прежде чем задавать вопрос, см. "FAQ",если там не нашли ответа, воспользуйтесь ПОИСКОМ, возможно, такую задачу уже решали!
4. Не предлагайте свои решения на других языках, кроме Ассемблера. Исключение только с согласия модератора.
5. НЕ используйте форум для личного общения! Все, что не относиться к обсуждению темы - на PM!
6. Проверяйте программы перед тем, как выложить их на форум!!

 
 Ответить  Открыть новую тему 
> перевод из Fasm в Tasm, как сделать?
leahov
сообщение 4.12.2008 10:10
Сообщение #1


Новичок
*

Группа: Пользователи
Сообщений: 39
Пол: Мужской
Реальное имя: leahov

Репутация: -  0  +


только начал изучать ассемблер, столкнулся с такой проблемой, есть код в 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
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
volvo
сообщение 4.12.2008 10:32
Сообщение #2


Гость






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

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

.code

proc mergeproc

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

mergeproc endp

start:

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

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

 К началу страницы 
+ Ответить 
leahov
сообщение 4.12.2008 10:51
Сообщение #3


Новичок
*

Группа: Пользователи
Сообщений: 39
Пол: Мужской
Реальное имя: leahov

Репутация: -  0  +


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

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


я понимаю что наверное какую то глупость сделал, подскажите пожалуйста в каком направлении искать
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
volvo
сообщение 4.12.2008 12:11
Сообщение #4


Гость






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

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

 Ответить  Открыть новую тему 
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 

- Текстовая версия 7.08.2025 5:06
Хостинг предоставлен компанией "Веб Сервис Центр" при поддержке компании "ДокЛаб"