Ввод/вывод не работает - Assembler

Узнай цену своей работы

Формулировка задачи:

Не корректно работает ввод/вывод, хотя все правильно сделала. Возможно причина в "шапке" в описании сегментов? Что я не так сделала?
STSEG  SEGMENT  PARA  STACK  'STACK'
DB 64 DUP ( 'STACK' ) 
STSEG  ENDS 
DSEG  SEGMENT  PARA  PUBLIC  'DATA'
SOURCE  DB 10, 20, 30, 40 
DEST  DB 4 DUP (?) 
DSEG  ENDS 
CSEG  SEGMENT PARA PUBLIC  'CODE' 
MAIN  PROC  FAR 
ASSUME  CS: CSEG, DS: DSEG, SS: STSEG 
; адреса повернення 
; Ввод целого числа
; Введём знаковое целое и сохраним его в AX.
inint   proc    near
        push    cx
        push    dx
        push    bx
        push    si
; В SI будет признак знака, в BX - число, CX тоже пригодится.
        xor     si, si
        xor     bx, bx
        xor     cx, cx
; Введём первый символ.
        mov     ah, 01h
        int     21h
; Здесь и только здесь может попасться минус. Если это не так,
; перейдём к обычной обработке символа.
        cmp     al, '-'
        jne     short @ii1
; Иначе установим признак знака и
        inc     si
; введём следующий символ.
@ii0:   mov     ah, 01h
        int     21h
; Если символ за '9', то ввод некорректный, прекратим этот беспредел.
@ii1:   cmp     al, 39h
        ja      short @ii2
; Переводим символ в число. Если при этом получится нечто отрицательное,
; то исходный символ перед '0', значит, ввод можно прерывать.
        sub     al, 30h
        jb      short @ii2
; Итак, в AL цифра, которую нужно приписать справа к уже имеющемуся
; в BX числу. Поместим цифру из AL в CX. Именно для этого он обнулялся.
        mov     cl, al
; Умножим текущий результат на 10.
        shl     bx, 1   ; BX = 2 * bx
        mov     ax, bx  ; AX = 2 * bx
        shl     ax, 2   ; AX = 8 * bx
        add     bx, ax  ; BX = 10 * bx
        add     bx, cx  ; BX = 10 * bx + al
; И так, пока вводят цифры.
        jmp     short @ii0
; Когда ввели нецифру, посмотрим, надо ли менять знак,
@ii2:   test    si, si
        jz      short @ii3
        neg     bx
; перейдём на новую строку
@ii3:   mov     ah, 02h
        mov     dl, 0Dh
        int     21h
        mov     dl, 0Ah
        int     21h
; и запишем результат в AX.
        mov     ax, bx
        pop     si
        pop     bx
        pop     dx
        pop     cx
        ret
inint   endp
;Вывод целого числа
;Выведем знаковое целое в AX.
    outint  proc    near
        push    cx
        push    dx
        push    bx
        push    ax
; Проверяем число на знак.
        test    ax, ax
        jns     short @oi1
; Если оно отрицательное, выведем минус и оставим его модуль.
        mov     ah, 02h
        mov     dl, '-'
        int     21h
        pop     ax
        push    ax
        neg     ax
; Количество цифр будем держать в CX.
@oi1:   xor     cx, cx
        mov     bx, 10
@oi2:   xor     dx, dx
        div     bx
; Делим число на десять. В остатке получается последняя цифра.
; Сразу выводить её нельзя, поэтому сохраним её в стэке.
        push    dx
        inc     cx
; А с частным повторяем то же самое, отделяя от него очередную
; цифру справа, пока не останется ноль, что значит, что дальше
; слева только нули.
        test    ax, ax
        jnz     short @oi2
; Теперь приступим к выводу.
        mov     ah, 02h
@oi3:   pop     dx
; Извлекаем очередную цифру, переводим её в символ и выводим.
        add     dl, 30h
        int     21h
; Повторим ровно столько раз, сколько цифр насчитали.
        loop    @oi3
        pop     ax
        pop     bx
        pop     dx
        pop     cx
        ret
outint  endp
MAIN ENDP 
CSEG ENDS 
END MAIN

Решение задачи: «Ввод/вывод не работает»

textual
Листинг программы
MAIN PROC FAR
      CALL  inint
      CALL  outint
      MOV   AX, 4C00h
      INT   21h
MAIN ENDP

Оцени полезность:

6   голосов , оценка 4 из 5
Похожие ответы