Ошибка линковки и бесконечный цикл!

Тема в разделе "WASM.ASSEMBLER", создана пользователем __EXP__, 23 фев 2010.

  1. __EXP__

    __EXP__ New Member

    Публикаций:
    0
    Регистрация:
    13 фев 2010
    Сообщения:
    12
    Если откомпилить прогу masm 5.1 все компилится но в результате получаем бесконечный цикл вывода значений.
    Если откомпилить в masm 611 то выдает LINK : fatal error L1002: z2 : unrecognized option name
    Помогите понять в чем ошибка.
    Код (Text):
    1. d_seg segment 'data'
    2.  
    3. A dw 1d
    4. B dw 2d
    5. D dw 3d
    6. X dw 0
    7.  
    8. str0  db ' ',10,13,'$'
    9. str1  db 'Vipolnil BMKSS-3',10,13,'!!!_START_!!!',10,13,'$'
    10.  
    11. str2  db   '!!!_FINISH_!!!',10,13,'$'
    12. str_1 db   '1+2=','$'
    13. str_2 db '1+3+10=','$'
    14. str_3 db '1-3+10=','$'
    15. str_4 db '11-4+7=','$'
    16.  
    17. d_seg ends
    18.  
    19. c_seg segment 'code'
    20. assume ds:d_seg, cs:c_seg
    21.  
    22. START:
    23.  
    24. mov ah,9h
    25. lea dx,str1
    26. int 21h
    27. ;======================================РАСЧЕТ ПЕРВОЙ ФОРМУЛЫ========================================
    28. xor ax,ax
    29. mov ax,A
    30. mov dx,B
    31. add ax,dx
    32. mov X,ax
    33. mov ah,9h ; вызов 9 функции
    34. lea dx,str_1 ; вычисляем адрес строки и кладем его в dx
    35. int 21h ; вызываем 21 прерывание
    36. call OutText
    37. ;=====================================РАСЧЕТ ВТОРОЙ ФОРМУЛЫ=========================================
    38. xor ax,ax
    39. mov B,10d
    40. mov ax,A
    41. mov dx,D
    42. add ax,dx
    43. mov cx,B
    44. add ax,cx
    45. mov X,ax
    46. mov ah,9h ; вызов 9 функции
    47. lea dx,str_2 ; вычисляем адрес строки и кладем его в dx
    48. int 21h ; вызываем 21 прерывание
    49. call OutText
    50. ;====================================РАСЧЕТ ТРЕТЬЕЙ ФОРМУЛЫ=========================================
    51. xor ax,ax
    52. mov ax,D
    53. mov cx,B
    54. add ax,cx
    55.  
    56. mov dx,A
    57. sub dx,ax
    58. mov X,dx
    59. mov ah,9h ; вызов 9 функции
    60. lea dx,str_3 ; вычисляем адрес строки и кладем его в dx
    61. int 21h ; вызываем 21 прерывание
    62. call OutText
    63. ;=====================================РАСЧЕТ ЧЕТВЕРТОЙ ФОРМУЛЫ======================================
    64. xor ax,ax
    65. mov A,4
    66. mov B,7
    67. mov D,11
    68. mov ax,A
    69. mov bx,B
    70. add ax,bx
    71. mov cx,D
    72. sub cx,ax
    73. mov X,cx
    74. mov ah,9h ; вызов 9 функции
    75. lea dx,str_4 ; вычисляем адрес строки и кладем его в dx
    76. int 21h ; вызываем 21 прерывание
    77. call OutText
    78.  
    79. ;==================================ПОДПРОГРАММА===============================================
    80. OutText proc
    81.  
    82.       mov dx,X ; заносим значение  в регистр dx
    83.       mov ax,dx ; заносим значение регистра dx в  ax
    84.       mov bx,10d ; значение 10 в dx
    85.       xor cx,cx ; очистка регистров
    86. non_zero_1: ; метка
    87.       xor dx,dx ; очистка регистров
    88.       div bx ; делим на 0 для перевода в строку
    89.       push    dx ; заносим полученое значение в стек
    90.       inc     cx ; инкреминируем
    91.       cmp     ax, 0 ; сравниваем ax c 0
    92.       jne     non_zero_1 ; если ноль то переходим к метке
    93.       mov     ah, 2h ; функция установки курсора
    94. write_digit_loop1:
    95.       pop     dx ;вынимаем значение из стека
    96.       add     dl, 30h ; переходим к значению по таблице ASSCII
    97.       int     21h ; вывод полученого значения
    98.       loop    write_digit_loop1 ; уменьшаем итерации
    99.    
    100.     mov ah, 9h
    101.     lea dx, str0
    102.     int 21h
    103.     ret
    104. OutText endp
    105. ;+++++++++++++++++++++++++++++++++++++++++++++++++++++++КОНЕЦ ВЫЧИСЛЕНИЙ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
    106.     mov ah, 9h
    107.     lea dx, str2
    108.     int 21h
    109.  
    110.     mov ah, 1h
    111.     int 21h
    112.     int 20h
    113.  
    114. c_seg ends
    115. end START
     
  2. Rockphorr

    Rockphorr Well-Known Member

    Публикаций:
    0
    Регистрация:
    9 июн 2004
    Сообщения:
    2.622
    Адрес:
    Russia
    ну для начала дириректива ассуме не делает за вас инициализацию сегментных регистров ds и es
     
  3. Rockphorr

    Rockphorr Well-Known Member

    Публикаций:
    0
    Регистрация:
    9 июн 2004
    Сообщения:
    2.622
    Адрес:
    Russia
    да и приведите строки как компилите и линкуете
    линкер у вас 16 bit али хатчевским 32 битным пытаетесь дос прогу сделать
     
  4. Rockphorr

    Rockphorr Well-Known Member

    Публикаций:
    0
    Регистрация:
    9 июн 2004
    Сообщения:
    2.622
    Адрес:
    Russia
     
  5. __EXP__

    __EXP__ New Member

    Публикаций:
    0
    Регистрация:
    13 фев 2010
    Сообщения:
    12
    Компилятор 16 битный , добавил строки
    mov ax,d_seg
    mov ds,ax
    А как тогда подпрограмму оформить чтобы повторно в нее не входить , я просто у Калашникова читал там так показано как сделал.
     
  6. Rockphorr

    Rockphorr Well-Known Member

    Публикаций:
    0
    Регистрация:
    9 июн 2004
    Сообщения:
    2.622
    Адрес:
    Russia
    jmp в обход или процедуру переместить выше метки старт в кодовом сегменте
     
  7. Rockphorr

    Rockphorr Well-Known Member

    Публикаций:
    0
    Регистрация:
    9 июн 2004
    Сообщения:
    2.622
    Адрес:
    Russia
    команды напишите с опциями которые ставите