Столкнулся с такой вот проблемой! Необходимо разделить 8 байт на 8 байт числа целые, беззнаковые... пытаюсь делить их "как на листочке" хочу реализовать школьный алгоритм в коде, но пока безрезультатно =( пробовал разделить эти несчастные 8 байт хотя бы на 10 для вывода числа на экран в десятичной форме, но получаю переполнение (дивайд оверфлоу) использовать могу только команды 8086 никаких там MMX, 32 разрядных регистров, сопроцессоров и тд... помогите, пожалуйста, исходником если у кого готовый завалялся или описанием алгоритма, который позволяет это реализовать... Большое Спасибо!
что получаешь при делении на 10? может ты dx не обнулил перед делением? попробуй обнулять dx и делить, как и говоришь - "на листике"
AlexCorvis похожее было в BEGINNERS->"16 битовое деление используя 8 битные регистры" по-моему в Юрове "Практикум по ассемблеру" есть деление m-байтного числа на n-байтное
алгоритм деления без восстановления Из делимого вычитается делитель, умноженный на степень двойки. Произведение числа на 2**n эквивалентно сдвигу этого числа на n разрядов влево. Если знак результата положительный, то нужно прибавить 2**n к частному, если знак результата отрицательный — частное не увеличивается. Когда знак результата меняется на отрицательный, вычитание заменяется сложением. Так повторяется при уменьшающихся степенях двойки до тех пор, пока не будет достигнута степень равная нулю. Остатком считается последний положительный результат
Спасибо всем за советы! сделал пока деление вычитанием... работает! но если значение у делисого очень большое, к пример, во всех 8 байт 0FFFFh, а делитель 10, то это убицца можно ждать! очень долго считает, хотя это и понятно! много раз вычитать нужно... вот исходник Код (Text): del8bytes proc next: mov CX, 4 xor SI, SI sr: mov AL, byte ptr a[SI] mov AH, byte ptr a[SI+1] mov BL, byte ptr b[SI] mov BH, byte ptr b[SI+1] inc SI inc SI cmp AX, BX jb a_menshe ja b_menshe loop sr b_menshe: clc mov CX, 4 mov SI, 8 vi4AB: dec SI dec SI mov AL, byte ptr a[SI] mov AH, byte ptr a[SI+1] mov BL, byte ptr b[SI] mov BH, byte ptr b[SI+1] sbb AX, BX mov byte ptr a[SI], AL mov byte ptr a[SI+1], AH loop vi4AB mov CX, 3 mov SI, 6 mov AL, byte ptr del[SI] mov AH, byte ptr del[SI+1] add ax, 1 mov byte ptr del[SI], AL mov byte ptr del[SI+1], AH incRez: dec SI dec SI mov AL, byte ptr del[SI] mov AH, byte ptr del[SI+1] adc ax, 0 mov byte ptr del[SI], AL mov byte ptr del[SI+1], AH loop incRez jmp next a_menshe: ret del8bytes endp тут я делю "a" на "b" и результат в "c" заношу... помогите оптимизировать эту процедурку, чтобы по-быстрее работала... на ее основе написал процедуру вывода чисел в десятичной форме.... так она вобще практически вешается как только числа больше FFFF FFFFh!!! все восемь байт так вобще наверно пол жизни считать будет хотя мне кажется тут нужен другой подход... какой-нить алгоритм по-умнее Mikl__, хотелось бы попробовать этот алгоритм не могу пока в него врубиться... какая степень двойки в начале должна быть? процедурку я написал по блок-схеме http://khpi-iip.mipk.kharkiv.edu/library/datastr/book_sod/structura/s5.gif взятой вот тут http://khpi-iip.mipk.kharkiv.edu/library/datastr/book_sod/structura/chapter3.htm
разделим 125 на 11. Делитель укладывается в байт (11<255) поэтому начинаем с 2**7. В начале вычисления частное всегда равно 0: 125 – 11 * 2**7 = –1283 –1283 +11 * 2**6 = –579 –579 +11 * 2**5 = –227 –227 +11 * 2**4 = –51 –51 + 11 * 2**3 = 37 ;результат положительный, поэтому складываем 2**3 с частным, частное равно 8+0=8 37 – 11 * 2**2 = – 7 –7 + 11 * 2**1 = 15 ;результат положительный, поэтому складываем 2**1 с частным, частное равно 8+2=10 15 –11 * 2**0 = 4 ;результат положительный, поэтому складываем 2**0 с частным, частное равно 10+1=11, остаток равен 4