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

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

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 16.04.2013, 23:47   #1
ASM_eternal
Новичок
Джуниор
 
Регистрация: 16.04.2013
Сообщений: 2
По умолчанию Assembler, особенность операции DIV?

Написал по заданию программу, перевода числа из любой системы счисления в двоичную( на деле пока только 10чная, 8ная и 16я).
Суть проблемы в том, что при делении происходит нечто странное. Изначально написал для малых чисел ( в байтах), там всё работало, за исключением ограниченности в размерах вводимых чисел. Попробовал адаптировать под большие числа, тут то и полезли неведомые мне баги, проходился отладчиком несколько раз, но это не помогло понять, что происходит.
А теперь на деле:
Вот процедура, в которой и зарыта собака, прошу простить за несуразность её содержимого, в попытках исправлять добавлял костыли, которые, в общем то, не сильно помогли.
Код:
TRANSLATE PROC
 	mov SI, 0 
	mov cx, dx
	call CRLF
	mov ax, cx ; здесь несомненно перемудрил с регистрами, проще, наверное было создать лишнюю переменную. Вся суть в передаче полученного на входе числа, здесь, собственно вопросов нет.
	mov CX, 0	
	xor dx, dx
	cmp ah, 0
	JNE repeat
mov check, 0

 repeat:
 	inc CX
	div dva       ;  на этом моменте происходит поломка
; костыль, частично исправивший, но не сильно

         cmp check, 1
	JNE go
	cmp ah, 0
	JNE okay
	mov check, 0
 go:
	xor ah, ah


okay:
 	push dx ;  перевод в двоичную систему, остатки в стек, затем извлекаются в обратном порядке
 	cmp ax, 2
 	JAE  repeat
; собственно, печать
	
	mov dx, ax
	add dl, '0'
	call putch
PECHAT:
	pop dx
	add dl, '0'
	call putch
	inc si
loop PECHAT

	
	 RET
TRANSLATE ENDP
Разберу проблему на примере числа FFFh:
В регистре AX частное, в DX остаток.
Первый шаг деления пропускаю, ибо он адекватен, начну со второго.
Частное от деления 7FF на 2 должно записаться в AX.
1.jpg
86Xjtrodykg.jpg
оно туда записывается, но в AH вместо 3h попадает 83h. Откуда?!
Я, конечно, могу еще костылей понавставлять и оно может быть и будет адеватно работать, но в чем тут суть?
С более мелкими числами работает адекватно, то есть проблема возникает только начиная с некоторого числа.
ASM_eternal вне форума Ответить с цитированием
Старый 17.04.2013, 00:44   #2
ASM_eternal
Новичок
Джуниор
 
Регистрация: 16.04.2013
Сообщений: 2
По умолчанию

осенило, вопрос закрыт
ASM_eternal вне форума Ответить с цитированием
Старый 17.04.2013, 07:48   #3
s-andriano
Старожил
 
Аватар для s-andriano
 
Регистрация: 08.04.2012
Сообщений: 3,229
По умолчанию

Прежде всего в DX следует занести старшую часть числа. Если ее нет - обнулить.
И в процессе деления следить, чтобы DX содержал именно старшую часть делимого, а не остаток от предыдущей операции.
s-andriano вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Доделать задачу на assembler - четное число уменьшено в два раза без использования операции деления hodok93 Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 7 31.05.2012 14:00
Арифметические операции Assembler Banderas123 Помощь студентам 0 17.10.2011 21:57
Арифметические операции Assembler aly-lucenko Помощь студентам 2 25.05.2011 11:06
Assembler. Битовые операции. artemonary Помощь студентам 18 11.05.2011 12:01