Не могу справится с подпрограммой.

Тема в разделе "WASM.BEGINNERS", создана пользователем Beowulf, 17 апр 2007.

  1. Beowulf

    Beowulf New Member

    Публикаций:
    0
    Регистрация:
    12 апр 2007
    Сообщения:
    20
    Простите, это снова я.

    Не работает почему-то, точнее работает, но криво. Код здесь. (думал сюда не влезет и забанят (: )
    по идее, должна писать код в двух частях экрана. Но не пишет.

    Заранее, спасибо.

    Код (Text):
    1. ;программа ввода и вывода числа
    2. sta segment     stack
    3.     db  256 dup (?)
    4. sta ends
    5.  
    6. dan segment
    7.     num dw  ?
    8. dan ends
    9.  
    10. cod segment
    11.     assume  cs:cod,ds:dan,ss:sta
    12. beg:
    13.     mov dx,ds    ;загружаем начало сегмента данных
    14.     mov ax,dx    ;в регистр dx
    15.  
    16. ;очистка экрана
    17.     mov ax,0600h
    18.     mov bh,15
    19.     mov cx,00h
    20.     mov dx,184fh
    21.     int 10h
    22. ;-------------------------
    23.  
    24. ;установка позиции курсора
    25.     mov dx,0000h
    26.     mov bh,00h
    27.     mov ah,02h
    28.     int 10h
    29. ;-------------------------
    30. ;ввод числа
    31.     mov si,10        ;работаем с десятичной нотацией
    32.     mov di,0
    33. @aa:
    34. ; вводим число до нажатия клавиши "ВВОД"
    35.     mov ah,01h
    36.     int 21h
    37.     cmp al,13   ; проверяем нажатие клавиши "ВВОД"
    38.     jz a1           ; если клавиша нажата, то переходим на конец
    39.             ; обработки ввода числа
    40.             ; иначе выполняем следующие 8 пунктов
    41.  
    42.     sub al,'0'      ; из кода ASCII получаем цифру
    43.     xor ah,ah       ; теперь значение ах равно значению al
    44.     mov cx,ax       ; копируем ах в сх
    45.     mov ax,di       ;записываем в ах введенное до текущей цифры число
    46.     mul si          ;умножаем его на 10, переходя тем самым в текущий
    47.             ;разряд
    48.     add ax,cx       ;добавляем к числу текущую цифру
    49.     mov di,ax       ;сохраняем текущее число в di
    50.     jmp @aa         ; переходим на обработку следующего разряда
    51. a1:
    52.     mov num,di      ; сохраняем окончательное значение введенного числа
    53.             ; в переменной "num"
    54.  
    55. outp    proc    near        ;макроопределение для вывода на экран
    56.     mov si,10
    57.     mov ax,num
    58.     mov cx,0
    59.  
    60. a:
    61.     mov dx,0
    62.     div si
    63.     add dx,'0'
    64.     push    dx
    65.     inc cx
    66.     cmp ax,0
    67.     jnz a
    68. aa:
    69.     pop dx
    70.     mov ah,02h
    71.     int 21h
    72.     loop    aa
    73.    
    74.     ret
    75.  
    76. outp    endp
    77.  
    78. ;--------------------------
    79. ;установка позиции курсора
    80.     mov dx,0B00h
    81.     mov bh,0h
    82.     mov ah,02h
    83.     int 10h
    84. ;--------------------------
    85. ;вывод числа
    86.     call    outp
    87. ;----------------------------
    88.    
    89.     mov dx,0B46h
    90.     mov bh,0h
    91.     mov ah,02h
    92.     int 10h
    93.    
    94.     call    outp
    95.  
    96.     mov ah,01h      ;организуем задержку выполнения программы
    97.     int 21h     ;до нажатия клавиши
    98.  
    99.     mov ah,4Ch      ;обработка окончания
    100.     int 21h     ;программы
    101. cod ends
    102. end beg
     
  2. Beowulf

    Beowulf New Member

    Публикаций:
    0
    Регистрация:
    12 апр 2007
    Сообщения:
    20
    С подпрограммой разобрался, она тут ни при чем. У меня почему то из процедуры не возвращается в то место, откуда я ее вызвал. А снова в начало, что делать? ):
     
  3. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    ну если управление не туда возвращается, проверь адрес возврата в стеке ;)
     
  4. Beowulf

    Beowulf New Member

    Публикаций:
    0
    Регистрация:
    12 апр 2007
    Сообщения:
    20
    вынес прок за последний инт, все заработало.
     
  5. n0name

    n0name New Member

    Публикаций:
    0
    Регистрация:
    5 июн 2004
    Сообщения:
    4.336
    Адрес:
    Russia
    конечно, ведб proc - это макрос он транслирует в асм код то, что ты написал, никакого контроля не производит.
    И получается у тебя код:
    Код (Text):
    1. a1:
    2.     mov num,di      ; сохраняем окончательное значение введенного числа
    3.             ; в переменной "num"
    4.     push ebp
    5.     mov ebp, esp
    6.     ...
    Потом идёт рет, который и вовращает управление из програмы.