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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 09.02.2009, 05:27   #1
better
 
Регистрация: 09.02.2009
Сообщений: 6
По умолчанию tasm>>fasm

помогите перевести:
суть программки - сортировка массива по возрастанию

Код:
TASM:
MASM
MODEL	small
STACK	256
.data
mes1	db	0ah,0dh,'Исходный массив - $',0ah,0dh
;некоторые сообщения
mes2	db	0ah,0dh,'Отсортированный массив - $',0ah,0dh
n	equ	9	;количество элементов в массиве, считая с 0
mas	dw	2,7,4,0,1,9,3,6,5,8	;исходный массив
tmp	dw	0	;переменные для работы с массивом
i	dw	0
j	dw	0
.code
main:
	mov	ax,@data
	mov	ds,ax
	xor	ax,ax
;вывод на экран исходного массива
	mov	ah,09h
	lea	dx,mes1
	int	21h	;вывод сообщения mes1
	mov	cx,10
	mov	si,0
show_primary:	;вывод значения элементов
		;исходного массива на экран
	mov	dx,mas[si]
	add	dl,30h
	mov	ah,02h
	int	21h
	add	si,2
	loop	show_primary

	mov	i,0	;инициализация i
;внутренний цикл по j
internal:
	mov	j,9	;инициализация j
	jmp	cycl_j	;переход на тело цикла
exchange:		
	mov	bx,i	;bx=i
	shl	bx,1
	mov	ax,mas[bx]	;ax=mas[i]
	mov	bx,j	;bx=j
	shl	bx,1
	cmp	ax,mas[bx]	;mas[i] ? mas[j] - сравнение элементов
	jle	lesser	;если mas[i] меньше, то обмен не нужен и ;переход на продвижение далее по массиву
;иначе tmp=mas[i], mas[i]=mas[j], mas[j]=tmp:
;tmp=mas[i]
	mov	bx,i	;bx=i
	shl	bx,1	;умножаем на 2, так как элементы - слова
	mov	tmp,ax	;tmp=mas[i]

;mas[i]=mas[j]
	mov	bx,j	;bx=j
	shl	bx,1	;умножаем на 2, так как элементы - слова
	mov	ax,mas[bx]	;ax=mas[j]
	mov	bx,i		;bx=i
	shl	bx,1	;умножаем на 2, так как элементы - слова
	mov	mas[bx],ax	;mas[i]=mas[j]

;mas[j]=tmp
	mov	bx,j		;bx=j
	shl	bx,1	;умножаем на 2, так как элементы - слова
	mov	ax,tmp		;ax=tmp
	mov	mas[bx],ax	;mas[j]=tmp
lesser:	;продвижение далее по массиву во внутреннем цикле
	dec	j	;j--
;тело цикла по j
cycl_j:
	mov	ax,j	;ax=j
	cmp	ax,i	; сравнить j ? i
	jg	exchange	;если j>i, то переход на обмен
;иначе на внешний цикл по i
	inc	i	;i++
	cmp	i,n		;сравнить i ? n - прошли до конца массива
	jl	internal	;если i<n продолжение обработки

;вывод отсортированного массива
	mov	ah,09h
	lea	dx,mes2
	int	21h
prepare:
	mov	cx,10
	mov	si,0
show:		;вывод значения элемента на экран
	mov	dx,mas[si]
	add	dl,30h
	mov	ah,02h
	int	21h
	add	si,2
	loop	show
exit:
	mov	ax,4c00h	;стандартный выход
	int	21h
end	main		;конец программы
попытка перевести в fasm:
Код:
format MZ
segment _data
mes1	db	0ah,0dh,'source: $',0ah,0dh
mes2	db	0ah,0dh,'result: $',0ah,0dh
n	equ	9	
mas	dw	2,7,4,0,1,9,3,6,5,8
tmp	dw	0	
i	dw	0
j	dw	0
segment _code
main:
	mov	ax,_data
	mov	ds,ax
	xor	ax,ax
	mov	ah,09h
	mov	dx,mes1
	int	21h	
	mov	cx,10
	mov	si,0
	
show_primary:
		
	mov	dx,[mas+si]
	add	dl,30h
	mov	ah,02h
	int	21h
	add	si,2
	loop	show_primary

	mov	[i],0

internal:
	mov	[j],9	
	jmp	cycl_j	
exchange:		
	mov	bx,i	
	shl	bx,1
	mov	ax,[mas+bx]
	mov	bx,j	
	shl	bx,1
	cmp	ax,[mas+bx]
	jle	lesser	

	mov	bx,i                               ; зачем менять содержимое bx?
	shl	bx,1                              ; 
	mov	[tmp],ax	;tmp=mas[i]
;mas[i]=mas[j]
	mov	bx,j	                            ; а потом обратно, если 
                                                    ; оно  тут не юзается
	shl	bx,1	                            ;
	mov	ax,[mas+bx]	;ax=mas[j]
	mov	bx,i		;bx=i
	shl	bx,1	
	mov	[mas+bx],ax	;mas[i]=mas[j]
;mas[j]=tmp
	mov	bx,j		;bx=j
	shl	bx,1	
	mov	ax,tmp		;ax=tmp
	mov	[mas+bx],ax	;mas[j]=tmp
lesser:
    dec [j]                           ; проблема собственно в этом

cycl_j:
	mov	ax,j	;ax=j
	cmp	ax,i	
	jg	exchange	

	inc	[i]	;i++          и в этом
	cmp	[i],n		
	jl	internal

	mov	ah,09h
	lea	dx,[mes2]
	int	21h
prepare:
	mov	cx,10
	mov	si,0
show:		
	mov	dx,[mas+si]
	add	dl,30h
	mov	ah,02h
	int	21h
	add	si,2
	loop	show
exit:
	mov	ax,4c00h	
	int	21h

Последний раз редактировалось better; 09.02.2009 в 13:52.
better вне форума Ответить с цитированием
Старый 09.02.2009, 08:23   #2
rpy3uH
добрый няша
Старожил
 
Аватар для rpy3uH
 
Регистрация: 29.10.2006
Сообщений: 4,804
По умолчанию

и что дальше?
rpy3uH вне форума Ответить с цитированием
Старый 09.02.2009, 09:03   #3
better
 
Регистрация: 09.02.2009
Сообщений: 6
По умолчанию

Цитата:
Сообщение от rpy3uH Посмотреть сообщение
и что дальше?
1. оно не работает (ничего не выводит)
2. как перейти к следущему элементу в списке, в тасм это делается как dec j (уменьшение адреса), в фасм это не проходит (dec [j] уменьшает значение содержимого насколько я понял)
better вне форума Ответить с цитированием
Старый 09.02.2009, 12:30   #4
Ivan_32
somewhere else
Участник клуба
 
Аватар для Ivan_32
 
Регистрация: 17.07.2008
Сообщений: 1,409
По умолчанию

ну да, правильно, так что мешает написать dec j ? Разве оно не компилируется? Просто для проверки напишите вот вместо dec [j] вот эти строки:
Код:
push eax
mov eax,j
dec eax
mov j,eax
pop eax
Это мусорный код но 100% должен сработать, если по прежнему проблемы значит ошибка не в нем или на j открыт еще один дескриптор кроме вашего.
"Тяжело в учении, легко в бою" - А.В. Суворов

Последний раз редактировалось rpy3uH; 09.02.2009 в 12:41.
Ivan_32 вне форума Ответить с цитированием
Старый 09.02.2009, 13:44   #5
better
 
Регистрация: 09.02.2009
Сообщений: 6
По умолчанию

в этом вся и проблема что не работает, думал все дело в синтаксисе фасма...
и так
mov j,eax ;invalid operand
и так
dec j ;invalid operand

будем разбираться дальше
better вне форума Ответить с цитированием
Старый 09.02.2009, 14:00   #6
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
оно не работает (ничего не выводит)
Мож потому не работает что там ДОСовское прерывание используется?

Переведи это в WIN нормальные код
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 09.02.2009, 14:20   #7
JTG
я получил эту роль
Старожил
 
Аватар для JTG
 
Регистрация: 25.05.2007
Сообщений: 3,694
По умолчанию

Гг, я думаю стоит начать с "entry _code:main"
--
а закончить вот так

Код:
Format MZ
entry _code:main
stack  256

segment _data

mes1    db      0ah,0dh,'Unsorted - $',0ah,0dh ;некоторые сообщения
mes2    db      0ah,0dh,'Sorted - $',0ah,0dh
n       equ     9       ;количество элементов в массиве, считая с 0
mas     dw      2,7,4,0,1,9,3,6,5,8     ;исходный массив
tmp     dw      0       ;переменные для работы с массивом
i       dw      0
j       dw      0

segment _code

main:
        mov     ax,_data
        mov     ds,ax
        xor     ax,ax
;вывод на экран исходного массива
        mov     ah,09h
        mov     dx,mes1
        int     21h     ;вывод сообщения mes1
        mov     cx,10
        mov     si,0
show_primary:   ;вывод значения элементов
                ;исходного массива на экран
        mov     dx,[mas+si]
        add     dl,30h
        mov     ah,02h
        int     21h
        add     si,2
        loop    show_primary

        mov     [i],0     ;инициализация i
;внутренний цикл по j
internal:
        mov     [j],9     ;инициализация j
        jmp     cycl_j  ;переход на тело цикла
exchange:               
        mov     bx,[i]    ;bx=i
        shl     bx,1
        mov     ax,[mas+bx]      ;ax=mas[i]
        mov     bx,[j]    ;bx=j
        shl     bx,1
        cmp     ax,[mas+bx]      ;mas[i] ? mas[j] - сравнение элементов
        jle     lesser  ;если mas[i] меньше, то обмен не нужен и ;переход на продвижение далее по массиву
;иначе tmp=mas[i], mas[i]=mas[j], mas[j]=tmp:
;tmp=mas[i]
        mov     bx,[i]    ;bx=i
        shl     bx,1    ;умножаем на 2, так как элементы - слова
        mov     [tmp],ax  ;tmp=mas[i]

;mas[i]=mas[j]
        mov     bx,[j]    ;bx=j
        shl     bx,1    ;умножаем на 2, так как элементы - слова
        mov     ax,[mas+bx]      ;ax=mas[j]
        mov     bx,[i]            ;bx=i
        shl     bx,1    ;умножаем на 2, так как элементы - слова
        mov     [mas+bx],ax      ;mas[i]=mas[j]

;mas[j]=tmp
        mov     bx,[j]            ;bx=j
        shl     bx,1    ;умножаем на 2, так как элементы - слова
        mov     ax,[tmp]          ;ax=tmp
        mov     [mas+bx],ax      ;mas[j]=tmp
lesser: ;продвижение далее по массиву во внутреннем цикле
        dec     [j]       ;j--
;тело цикла по j
cycl_j:
        mov     ax,[j]    ;ax=j
        cmp     ax,[i]    ; сравнить j ? i
        jg      exchange        ;если j>i, то переход на обмен
;иначе на внешний цикл по i
        inc     [i]       ;i++
        cmp     [i],n             ;сравнить i ? n - прошли до конца массива
        jl      internal        ;если i<n продолжение обработки

;вывод отсортированного массива
        mov     ah,09h
        mov     dx,mes2
        int     21h
prepare:
        mov     cx,10
        mov     si,0
show:           ;вывод значения элемента на экран
        mov     dx,[mas+si]
        add     dl,30h
        mov     ah,02h
        int     21h
        add     si,2
        loop    show
exit:
        mov     ax,4c00h        ;стандартный выход
        int     21h
Синтаксис tasm и fasm на 80% совместим, только надо обращать внимание на адрес/содержимое памяти/регистров
пыщь

Последний раз редактировалось JTG; 09.02.2009 в 14:28.
JTG вне форума Ответить с цитированием
Старый 09.02.2009, 14:20   #8
better
 
Регистрация: 09.02.2009
Сообщений: 6
По умолчанию

Цитата:
Сообщение от Stilet Посмотреть сообщение
Мож потому не работает что там ДОСовское прерывание используется?

Переведи это в WIN нормальные код
программка то изначально под дос,если речь конечно не про регистр eax (хз используется ли он в дос, но даже с ax не работает)
думал с дос начать...
better вне форума Ответить с цитированием
Старый 09.02.2009, 14:32   #9
better
 
Регистрация: 09.02.2009
Сообщений: 6
По умолчанию

Цитата:
Сообщение от JTG Посмотреть сообщение
Гг, я думаю стоит начать с "entry _code:main"
спасибо
better вне форума Ответить с цитированием
Старый 09.02.2009, 14:37   #10
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Вот так я когда-то на МАСМе решал сортировку.
Мож поможет.
Код:

arr				dw 1,20,6,5,4,8,96
s				db "qwqeqeqeqeqeq"
lenarr			equ 6

p proc
  mov ecx, lenarr
a4:
  push ecx
  mov ecx, lenarr
  mov ebx, offset arr
a2:
 mov ax, [ebx]
 mov dx, [ebx+2]
 cmp ax,dx
 jg a3
 mov [ebx],dx
 mov [ebx+2], ax
a3:
 add ebx,2
 loop a2
 pop ecx
 loop a4
;---------------
 mov ecx, lenarr
 mov esi, offset arr
a1:
 push ecx
 lodsw
 invoke dwtoa, eax, addr s
 invoke SendMessage, hwndlistbox1, LB_ADDSTRING, 0, addr s
 pop ecx
 loop a1
 ret
p endp
I'm learning to live...
Stilet вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Учебник по FASM Roof Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 33 09.12.2013 23:16
TASM дело тонкое!:) (Где в TASM IDE?) 3.14oner Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 9 15.11.2011 16:20
LEA [FASM] m32 Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 10 03.10.2010 13:57
Обьясните различия между - FASM, WASM, VASM, MASM, TASM Amancha Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 9 17.01.2009 15:38
Не компилируется исходник FASM nikleb Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 4 09.03.2008 17:34