Доброе время суток всем, проблема, с которой справится уже третий день не могу, отладчик(turbo debugger) под dos выдает что неправильная версия линкера и отказывается отлаживать... Функция должна вычислять частотное от сверх больших чисел Функция на с: Код (Text): extern "c" DIVLONG(unsigned int *a,unsigned int *b,unsigned int *c,unsigned int a1,unsigned int b1,unsigned int *a); Модель используется Large вот сама функция на асме, до места где зацикливается: Код (Text): .model large public _sublong code segment ASSUME cs:code ; 6 указатель на делимое ; 10 указатель на делитель ; 14 указатель на ответ ; 18 число символов делимого ; 20 число символов делителя ; 22 число символов частного(указатель) ; _sublong proc far push bp mov bp,sp begin: MOV AX,CS MOV DS,AX jmp s1 devider dw 10 dup(0) devidend dw 10 dup(0) particular dw 10 dup(0) _devider dw 0 ;делитель _devidend dw 0 ;делимое _particular dw 0 debug_ad DW 0 ; counter dw 0 ; s1: ;/*пишем кол-во символов devider*/ mov ax,word ptr [bp+18] lea bx,_devidend ; запись делимого mov [bx],ax ;/*пишем кол-во символов делителя*/ mov ax, word ptr [bp+20] lea bx,_devider ;запись делителя mov [bx],ax ;/*получаем указатель на делимое*/ lea bx,_devidend ;запись делимого ;/*получаем значение цикла перезаписи*/ mov cx,[bx] les si, dword ptr [bp+6] mov ax,20 loop1: dec ax dec ax lea bx,devidend add bx,ax push ax mov ax,word ptr es:[si] mov cs:[bx],ax pop ax inc si inc si loop loop1 lea bx,_devider ;запись делителя mov cx,[bx] mov ax,20 les si, dword ptr [bp+10] ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ loop2: dec ax dec ax lea bx,devider add bx,ax push ax mov ax,word ptr es:[si] mov cs:[bx],ax pop ax inc si inc si loop loop2 ;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ;/*окончание занесения данных*/ ; ДО СЮДА КОД РАБОЧИЙ!!!! РЕВИЗИЯ!!!!! 14.12.2009 НЕ ИСПОЛЬЗОВАТЬ DX ПОКА НЕ ПОЙМЕШЬ КАК ОН РАБОТАЕТ!!! cmp_: ;/*цикл сравнения чисел*/ mov cx,10 dec cx mov ax,0 loop3: lea bx,devidend ; считываем делимое add bx,ax push cx mov cx,cs:[bx] lea bx,devider ;считываем делитель1 add bx,ax sub cx,cs:[bx] ; от делимого отнимает делитель jc Preparation_for_exit ;/*если ax меньше bx то подготавливаемся к выходу*/ cmp cx,0 ja drkm pop cx inc ax inc ax loop loop3 jmp drks drkm: pop cx ;/*делимое больше делителя*/ drks: ;/*производим вычитание*/ mov cx,10 mov ax,18 ;/*сбрасываем флаг переноса*/ clc ;/*программа вылетает!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!*/ ;/*для совмещения кода*/ PUSHF loop4: lea bx,counter mov [bx],cx lea bx,devider ; получаем делитель add bx,ax mov cx,[bx] lea bx,devidend ; получаем делимое add bx,ax POPF sbb [bx],cx ; из делимого вычитаем делитель PUSHF dec ax dec ax lea bx,counter mov cx,[bx] loop loop4 POPF ;/*увеличиваем частное*/ mov dx,1 mov ax,18 mov cx,10 ;/*сбрасываем флаг переноса*/ clc PUSHF loop5: lea bx,particular add bx,ax POPF adc [bx],dx PUSHF mov dx,0 dec ax dec ax loop loop5 POPF jmp cmp_ preparation_for_exit: до preparation_for_exit не доходит зацикливается... не могу понять где
Извини, долго разбираться, я не выдержу столько. А вот советом помогу. 1. Почему TD? Другие отладчики под DOS есть. IDA Pro, по-моему, вполне подойдёт для этой цели. 2. Ну и второй универсалный способ - выводи в консоль метки какие-нибудь, вполне по ним можно проследить ход выполнения программы: Код (Text): loop5: lea bx,particular add bx,ax POPF adc [bx],dx PUSHF mov dx,0 dec ax dec ax ; cout << "goto loop5"; loop loop5