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

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

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

> перевод из 10ричной системы, есть ошибки
Глюк
сообщение 16.04.2008 16:02
Сообщение #1


Новичок
*

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

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


программка переводит из 10ричной системы в 16,8,2ичные...кроме ответов на экран выводятся символы какие-то и после вывода не выходит сразу...Где-т ошибка sad.gif((
может кто-нибудь помочь с комментариями к этой программке rolleyes.gif ,т.к. в ассемблере я новичок,понятно,но н все - есть сомнения

.model tiny
.code
	org		100h
start:

	mov		ax,6219
	push	ax
	push	ax
	
	mov		bx,16
	lea		si,string
	call	IntToStr
	mov		ah,9
	lea		dx,string
	int		21h

	pop		ax
	mov		bx,8
	lea		si,string
	call	IntToStr
	mov		ah,9
	lea		dx,Break
	int		21h
		
	pop		ax
	mov		bx,2
	lea		si,string
	call	IntToStr
	mov		ah,9
	lea		dx,Break
	int		21h

		
	mov		ah,8
	int		21h
	ret
Break db 13,10
string db 64 dup('$')

IntToStr proc
;IN:
;ESI = address of the string to output the number
;EAX = nubmer to convert to string
;EBX = scale of notation
;
;OUT:
;number, converted to string at address, passed in ESI
;EBX = 0 if Error

;check scale of notation
	cmp		bx,9+26;9 digits and 26 letters
	jae		its_out_of_range

	push	dx
	push	di
	push	cx
	
its_sgn_plus:
	xor		cx,cx
	mov		di,si
its_repeat:
	xor		dx,dx
	div		bx
	cmp		dl,10
	jge		its_letter
	add		dl,30h
	jmp		its_notletter
its_letter:
	add		dl,41h-10
its_notletter:
	mov		byte ptr [di],dl
	inc		cx
	inc		di
	test	ax,ax
	jne		its_repeat
	
	push	cx
	shr		cx,1
	jnc		$+3
	inc		cx

its_invert_order:
	dec		di
	mov		dl,byte ptr [di]
	mov		al,byte ptr [si]
	mov		byte ptr [si],dl
	mov		byte ptr [di],al
	inc		si
	dec		cx	;loop its_invert_order
	jnz		its_invert_order
	pop		cx
	
	pop		cx
	pop		di
	pop		dx
	ret
	
its_out_of_range:
	xor		bx,bx	;EBX = 0 if Error
	ret

IntToStr endp
end start
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
 
 Ответить  Открыть новую тему 
Ответов(1 - 7)
xds
сообщение 16.04.2008 20:12
Сообщение #2


N337
****

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

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


Программа работает правильно: она выводит 3 строчки - шестнадцатеричное, восьмеричное и двоичное представление десятичного числа 6219, а затем ждет нажатия на любую клавишу (по задумке автора - чтобы можно было рассмотреть результат) и завершается.

Добавлено через 17 мин.
.model tiny
.code
	org		100h
start:

	mov		ax,6219			;ax = 6219 (число, которое надо перевести)
	push	ax				;сохраняем две его копии в стек
	push	ax
	
	;перевод в шестнадцатеричный вид
	mov		bx,16			;bx = 16 - основание системы, в которую надо перевести
	lea		si,string		;si указывает на буфер, в который надо записать строку - результат перевода
	call	IntToStr		;обращение к процедуре перевода
	mov		ah,9			;вывод результата - системный вызов DOS int 21h/ah = 9 - вывод строки
	lea		dx,string
	int		21h

	;перевод в восьмеричный вид
	pop		ax				;ax = 6219 - копия из стека
	mov		bx,8
	lea		si,string
	call	IntToStr
	mov		ah,9
	lea		dx,Break
	int		21h
		
	;перевод в двоичный вид
	pop		ax
	mov		bx,2
	lea		si,string
	call	IntToStr
	mov		ah,9
	lea		dx,Break
	int		21h

	;ожидать нажатия любой клавиши	
	mov		ah,8
	int		21h

	;выход из программы - переход на адрес PSP:0, по которому располагается системный 
	;вызов DOS int 20h - завершение работы программы
	ret

Break db 13,10			;последовательность символов CR, LF - переход на новую строку

string db 64 dup('$')	;буфер для записи результата перевода

;--- процедура записи числа в виде строки в заданной системе счисления ---
; (процедура откуда-то скопирована автором программы и переделана для 16-разрядного режима ЦП)
IntToStr proc
;Входные данные:
;SI = адрес буфера для вывода строки
;AX = число, которое надо преобразовать в строку
;BX = основание системы счисления
;
;Выходные данные:
;число, преобразованное в строку по адресу, указанному в SI
;BX = 0 в случае ошибки (если основание системы > 35 и десятичных цифр и латиских букв для записи числа недостаточно)

;проверка основания
	cmp		bx,9+26;9 цифр и 26 букв
	jae		its_out_of_range

	push	dx
	push	di
	push	cx
	
its_sgn_plus:
	xor		cx,cx
	mov		di,si
its_repeat:
	xor		dx,dx
	div		bx
	cmp		dl,10
	jge		its_letter
	add		dl,30h
	jmp		its_notletter
its_letter:
	add		dl,41h-10
its_notletter:
	mov		byte ptr [di],dl
	inc		cx
	inc		di
	test	ax,ax
	jne		its_repeat
	
	push	cx
	shr		cx,1
	jnc		$+3
	inc		cx

its_invert_order:
	dec		di
	mov		dl,byte ptr [di]
	mov		al,byte ptr [si]
	mov		byte ptr [si],dl
	mov		byte ptr [di],al
	inc		si
	loop	its_invert_order
	pop		cx
	
	pop		cx
	pop		di
	pop		dx
	ret
	
its_out_of_range:
	xor		bx,bx	;EBX = 0 в лучае ошибки
	ret

IntToStr endp
end start


--------------------
The idiots are winning.
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
Глюк
сообщение 16.04.2008 20:56
Сообщение #3


Новичок
*

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

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


спасибо,очень благодарен good.gif
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
Глюк
сообщение 17.04.2008 15:15
Сообщение #4


Новичок
*

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

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


но все-же...зачем после каждой строки с результатом(после 16рич,8,2...) идет строчки непонятных символов...
и после вывода результата,когда нажимаю на клавишу - не выходит,опять идут строки...и не выходит вообще...=((((
реализовал через tasm
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
xds
сообщение 19.04.2008 17:21
Сообщение #5


N337
****

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

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


Цитата(Глюк @ 17.04.2008 23:15) *

но все-же...зачем после каждой строки с результатом(после 16рич,8,2...) идет строчки непонятных символов...
и после вывода результата,когда нажимаю на клавишу - не выходит,опять идут строки...и не выходит вообще...=((((
реализовал через tasm
Странно, должно работать ровно (несмотря на то, что с переводом строк там придумка). Код в точности такой? Покажи вывод.


--------------------
The idiots are winning.
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
Глюк
сообщение 20.04.2008 12:33
Сообщение #6


Новичок
*

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

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


вот вывод...

Добавлено через 15 мин.
код такой...из программки вылетает не сразу...еще что-т выводит - не знаю что...но после одного нажатия точно не выходит...ни разу такого не было


Прикрепленные файлы
Прикрепленный файл  STRINGS.rar ( 249 байт ) Кол-во скачиваний: 282
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
Глюк
сообщение 25.04.2008 16:22
Сообщение #7


Новичок
*

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

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


ну так как? unsure.gif
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
xds
сообщение 26.04.2008 7:15
Сообщение #8


N337
****

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

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


Убери опцию /t из вызова tlink.


--------------------
The idiots are winning.
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 

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

 

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