Бесконечный цикл

Тема в разделе "LANGS.C", создана пользователем Ateist85, 15 дек 2009.

  1. Ateist85

    Ateist85 New Member

    Публикаций:
    0
    Регистрация:
    21 окт 2009
    Сообщения:
    5
    Доброе время суток всем, проблема, с которой справится уже третий день не могу, отладчик(turbo debugger) под dos выдает что неправильная версия линкера и отказывается отлаживать...
    Функция должна вычислять частотное от сверх больших чисел
    Функция на с:
    Код (Text):
    1. extern "c" DIVLONG(unsigned int *a,unsigned int *b,unsigned int *c,unsigned int a1,unsigned int b1,unsigned int *a);
    Модель используется Large
    вот сама функция на асме, до места где зацикливается:
    Код (Text):
    1. .model large
    2. public _sublong
    3.  
    4. code segment
    5. ASSUME cs:code
    6. ; 6  указатель на делимое
    7. ; 10  указатель на делитель
    8. ; 14 указатель на ответ
    9. ; 18 число символов делимого
    10. ; 20 число символов делителя
    11. ; 22 число символов частного(указатель)
    12. ;  
    13. _sublong proc far
    14. push bp
    15. mov bp,sp
    16. begin:
    17. MOV AX,CS
    18. MOV DS,AX
    19. jmp s1
    20. devider     dw 10 dup(0)
    21. devidend    dw 10 dup(0)
    22. particular  dw 10 dup(0)
    23.  
    24. _devider    dw 0 ;делитель
    25. _devidend   dw 0 ;делимое
    26. _particular dw 0
    27. debug_ad    DW 0 ;
    28. counter     dw 0 ;
    29. s1:
    30. ;/*пишем кол-во символов devider*/
    31. mov ax,word ptr [bp+18]
    32. lea bx,_devidend ; запись делимого
    33. mov [bx],ax
    34.  
    35.  
    36.  
    37.  
    38.  
    39.  
    40. ;/*пишем кол-во символов делителя*/
    41. mov ax, word ptr [bp+20]
    42. lea bx,_devider ;запись делителя
    43. mov [bx],ax
    44.  
    45.  
    46. ;/*получаем указатель на делимое*/
    47. lea bx,_devidend ;запись делимого
    48. ;/*получаем значение цикла перезаписи*/
    49. mov cx,[bx]
    50. les si, dword ptr [bp+6]
    51. mov ax,20
    52.  
    53. loop1:
    54.         dec ax
    55.         dec ax
    56.         lea bx,devidend
    57.         add bx,ax
    58.         push ax
    59.         mov ax,word ptr es:[si]
    60.         mov cs:[bx],ax
    61.         pop ax
    62.         inc si
    63.         inc si
    64.         loop loop1
    65.        
    66. lea bx,_devider ;запись делителя
    67. mov cx,[bx]
    68. mov ax,20
    69. les si, dword ptr [bp+10]
    70. ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
    71. loop2:
    72.         dec ax
    73.         dec ax
    74.         lea bx,devider
    75.         add bx,ax
    76.         push ax
    77.         mov ax,word ptr es:[si]
    78.         mov cs:[bx],ax
    79.         pop ax
    80.         inc si
    81.         inc si
    82.         loop loop2
    83. ;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
    84. ;/*окончание занесения данных*/
    85.  
    86. ; ДО СЮДА КОД РАБОЧИЙ!!!! РЕВИЗИЯ!!!!! 14.12.2009 НЕ ИСПОЛЬЗОВАТЬ DX ПОКА НЕ ПОЙМЕШЬ КАК ОН РАБОТАЕТ!!!
    87.  
    88.  
    89. cmp_:
    90. ;/*цикл сравнения чисел*/
    91. mov cx,10
    92. dec cx
    93. mov ax,0
    94. loop3:
    95.         lea bx,devidend ; считываем делимое
    96.         add bx,ax
    97.         push cx
    98.         mov cx,cs:[bx]
    99.                
    100.         lea bx,devider ;считываем делитель1
    101.         add bx,ax
    102.         sub cx,cs:[bx] ; от делимого отнимает делитель
    103.         jc Preparation_for_exit ;/*если ax меньше bx то подготавливаемся к выходу*/
    104.         cmp cx,0
    105.         ja drkm
    106.         pop cx
    107.         inc ax
    108.         inc ax
    109.         loop loop3
    110.         jmp drks
    111.        
    112. drkm:
    113. pop cx
    114. ;/*делимое больше делителя*/
    115. drks:
    116.  
    117. ;/*производим вычитание*/
    118.  
    119. mov cx,10
    120. mov ax,18
    121. ;/*сбрасываем флаг переноса*/
    122. clc
    123.  
    124. ;/*программа вылетает!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!*/
    125. ;/*для совмещения кода*/
    126. PUSHF
    127. loop4:
    128.         lea bx,counter
    129.         mov [bx],cx
    130.         lea bx,devider  ; получаем делитель
    131.         add bx,ax
    132.         mov cx,[bx]
    133.         lea bx,devidend ; получаем делимое
    134.         add bx,ax
    135.         POPF
    136.         sbb [bx],cx    ; из делимого вычитаем делитель
    137.         PUSHF
    138.         dec ax
    139.         dec ax
    140.         lea bx,counter
    141.         mov cx,[bx]
    142.         loop loop4
    143. POPF
    144. ;/*увеличиваем частное*/
    145. mov dx,1
    146. mov ax,18
    147. mov cx,10
    148. ;/*сбрасываем флаг переноса*/
    149. clc
    150. PUSHF
    151. loop5:
    152.         lea bx,particular
    153.         add bx,ax
    154.         POPF
    155.         adc [bx],dx
    156.         PUSHF
    157.         mov dx,0
    158.         dec ax
    159.         dec ax
    160.         loop loop5
    161. POPF
    162. jmp cmp_
    163.  
    164.  
    165.    
    166. preparation_for_exit:
    до preparation_for_exit не доходит зацикливается... не могу понять где
     
  2. Phuntik

    Phuntik New Member

    Публикаций:
    0
    Регистрация:
    4 фев 2008
    Сообщения:
    318
    Извини, долго разбираться, я не выдержу столько. А вот советом помогу.
    1. Почему TD? Другие отладчики под DOS есть. IDA Pro, по-моему, вполне подойдёт для этой цели.
    2. Ну и второй универсалный способ - выводи в консоль метки какие-нибудь, вполне по ним можно проследить ход выполнения программы:
    Код (Text):
    1. loop5:
    2.         lea bx,particular
    3.         add bx,ax
    4.         POPF
    5.         adc [bx],dx
    6.         PUSHF
    7.         mov dx,0
    8.         dec ax
    9.         dec ax
    10.     ;        cout << "goto loop5";
    11.         loop loop5
     
  3. Ateist85

    Ateist85 New Member

    Публикаций:
    0
    Регистрация:
    21 окт 2009
    Сообщения:
    5
    спасибо, попробую, если еще есть советы рад буду
     
  4. valterg

    valterg Active Member

    Публикаций:
    0
    Регистрация:
    19 авг 2004
    Сообщения:
    2.105
    Можно воспользоваться debug.com Нет GUI, но вполне удобно все.
     
  5. Ateist85

    Ateist85 New Member

    Публикаций:
    0
    Регистрация:
    21 окт 2009
    Сообщения:
    5
    debug.com это что?
     
  6. valterg

    valterg Active Member

    Публикаций:
    0
    Регистрация:
    19 авг 2004
    Сообщения:
    2.105
    Пардон он в NT стал EXE :
    c:\WINDOWS\system32\debug.exe