Ввод/вывод не работает - 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