St segment stack. db128 dup (?); это для системных нужд
db128 dup (?); это для системных нужд
dw 300 dup (?); это для хранения наших чисел
St ends
code segment
assume cs:code,ds:code,ss:st
T1 db′Вводите числа до нуля$′
T2 db ′Числа в обратном порядке:′,10,13,′$′
T3 db ′Ошибка – много чисел!′,10,13,′$′
program_start:
mov ax,code
mov ds,ax
mov dx, offset T1; Приглашение к вводу
Outstr
Newline
subcx,cx; хороший способ для cx:=0
L: inint ax
cmp ax,0; проверка конца ввода
je Pech; на вывод результата
cmp ax,2
jb L
cmp ax,100
ja L; проверка диапазона
cmpcx,300; в стеке уже 300 чисел ?
je Err
push ax; запись числа в стек
inc cx; счетчик количества чисел в стеке
jmp L
Pech: jcxz Kon; нет чисел в стеке
mov dx, offset T2
Outstr
L1: pop ax
outword ax,10; ширина поля вывода=10
loop L1
Kon: finish
Err:mov dx,T3
Outstr
Finish
code ends
end program_start
Заметим, что в нашей программе нет собственно переменных, а только строковые константы, поэтому мы не описали отдельный сегмент данных, а разместили эти строковые константы в кодовом сегменте. Можно считать, что сегменты данных и кода в нашей программе совмещены. Мы разместили строковые константы в начале сегмента кода, перед входной точкой программы, но с таким же успехом можно разместить эти строки и в конце кодового сегмента после последней макрокоманды finish.
Обратите внимание, как мы выбрали размер стека: 128 байт мы зарезервировали для системных нужд (как уже упоминалось, стеком будут пользоваться и другие программы, подробнее об этом будет рассказано далее) и 300 слов мы отвели для хранения введённых нами чисел. При реализации этой программы может возникнуть желание определять, что введено слишком много чисел, анализируя переполнение стека. Другими словами, вместо проверки
cmpcx,300; в стеке уже 300 чисел ?
je Err
казалось бы, можно было поставить проверку исчерпания стека
cmp SP,2; стек уже полон ?
jb Err
Это, однако, может повлечь за собой тяжёлую ошибку. Дело в том, что в стеке может остаться совсем мало места, а, как мы знаем, стек использует не только наша, но и другие программы, которые в этом случае будут работать неправильно.
Теперь, после того, как мы научились работать со стеком, вернёмся к дальнейшему рассмотрению команд перехода.
Дата добавления: 2015-10-05; просмотров: 1040;