Ханойские башни

Тема в разделе "WASM.ASSEMBLER", создана пользователем Holy_Storm, 10 дек 2007.

  1. Holy_Storm

    Holy_Storm New Member

    Публикаций:
    0
    Регистрация:
    10 дек 2007
    Сообщения:
    2
    Всем известна задача про ханойские башни. Число дисков 10, данные вывести надо в файл. Помогите, пжл, перевести паскалевский код на асм (Tasm 5.0), или подсказать с чего начать основную процедуру, с файлом сам разберусь:
    Код (Text):
    1. Program Hanoy;
    2. Const  k=10;
    3. Var
    4. a,b,c : Char;
    5. a1,b1,c1,s: Integer;
    6. fil:text;
    7.  
    8. Procedure Disk(n : Integer; a, b, c: Char);
    9. Begin
    10.  If n>0 Then
    11.  Begin
    12.   Disk(n-1,a,c,b);
    13.   Writeln(fil,'Диск ',n, ' переложить c ', a, '->', b);
    14.   If a='3' Then c1:=c1-1;
    15.   If a='2' Then b1:=b1-1;
    16.   If a='1' Then a1:=a1-1;
    17.   If b='3' Then c1:=c1+1;
    18.   If b='2' Then b1:=b1+1;
    19.   If b='1' Then a1:=a1+1;
    20.   Writeln(fil,b1,' ',a1,' ',c1);
    21.   Disk(n-1,c,b,a);
    22.   s:=s+1;
    23.  End;
    24. End;
    25.  
    26. Begin
    27. Assign (fil,'hanoy.txt');
    28. Rewrite(fil);
    29. a1:= 0; b1:= 0; c1:= k;
    30. a:= '3'; b:= '2'; c:= '1';
    31. Disk(k,a,b,c);
    32. Append(fil);
    33. Writeln(fil,'Количество перестановок ', s);
    34. Close(fil);
    35. Writeln('Данные сохранены в файле Hanoy.txt...Нажмите клавишу Enter...');
    36. ReadLn;
    37. End.
    Вот сегодня пытался решить на асме, но после запуска в дебугере программа зависает, быть может проблемы со стеком? Подскажите, пожалуйста:)
    Код (Text):
    1. masm
    2.  
    3. .model small
    4.  
    5. .486
    6.  
    7. .stack 30h
    8.  
    9. .data
    10.     Str1 DB 'Программа отработала$'
    11.         a DB ?
    12.     b DB ?
    13.     c DB ?
    14.    
    15. .code
    16.  
    17. Hanoy proc
    18. Dec DI
    19. Push DI AX BX CX
    20. Pop BX CX AX DI
    21. Inc DI
    22. Add SP, 2
    23.  
    24. Call Hanoy
    25.  
    26. CMP AX, 3
    27. JNE U1
    28. Dec c
    29. U1:
    30.  
    31. CMP AX, 2
    32. JNE U2
    33. Dec b
    34. U2:
    35.  
    36. CMP AX, 1
    37. JNE U3
    38. Dec a
    39. U3:
    40.  
    41. CMP BX, 3
    42. JNE U4
    43. Inc c
    44. U4:
    45.  
    46. CMP BX, 2
    47. JNE U5
    48. Inc b
    49. U5:
    50.  
    51. CMP BX, 1
    52. JNE U6
    53. Inc a
    54. U6:
    55.  
    56. Dec DI
    57. Push DI AX BX CX
    58. Pop AX BX CX DI
    59. Inc DI
    60. Add SP, 2
    61.  
    62. Call Hanoy
    63.  
    64. Inc SI; SI - Число перестановок
    65.  
    66. Ret
    67. Hanoy endp
    68.  
    69. start:
    70.         mov ax, @data
    71.     mov ds, ax
    72.    
    73.     Mov a, 0
    74.     Mov b, 0
    75.     Mov c, 10
    76.  
    77. Mov DI, 10
    78. Mov AX, 3
    79. Mov BX, 2
    80. Mov CX, 1
    81.    
    82.     call Hanoy
    83.  
    84.     Mov AH, 09h
    85.     Mov DX, Offset Str1
    86.     Int 21h
    87.  
    88.     Mov AH, 10h
    89.     Int 16h
    90.  
    91.     mov ah, 4ch
    92.     int 21h
    93.    
    94. end start