Вопрос № 73438: Здравствуйте уважаемые эксперты по Ассемблеру. Напишите пожалуйста инструкции ассемблера для ввода чисел в регистр или переменную, и вывод их на экран в DOS....
Вопрос № 73.438
Здравствуйте уважаемые эксперты по Ассемблеру. Напишите пожалуйста инструкции ассемблера для ввода чисел в регистр или переменную, и вывод их на экран в DOS.
Отправлен: 31.01.2007, 11:46
Вопрос задал: Tiabc (статус: Посетитель)
Всего ответов: 3 Мини-форум вопроса >>> (сообщений: 0)
Отвечает: Sergijj
Здравствуйте, Tiabc!
Ввести строку можно, например, функцией 0Ah прерывания 21h.
На входе:
AH = 0Ah
DS:DX - сегмент и смещение буфера (строки), т.е. длинный указатель на него, куда функция будет "складывать" введённые символы, который нужно предварительно выделить (максимальная длина буфера 255 символа, из которых 2 символа тратятся на служебную информацию (см. далее)).
Причём буфер, поданный на вход функции, первым байтом должен содержать максимальное количество принимаемых символов (max = 254 символа (символы нумеруются с нуля, поэтому это число "уменьшаем" на 1)).
На выходе функции:
DS:DX - сегмент и смещение заполненного буфера (строки), где:
первый байт - максимум количества символов, положенный туда на входе;
второй байт - реально введённое количество символов (не учитывая терминатора);
далее следует сама введённая строка;
последним символом строки будет терминатор - CR = 0Dh = 13.
Затем следует преобразовать строку в число, например в десятичную систему счисления:
1. Каждый символ полученной строки (если он - цифра) преобразуем из ASCII-кода в собственно цифру, - для чего нужно вычесть из ASCII-кода цифры ASCII-код цифры "0" (нуль).
2. В цикле, начиная с конца, складывать получаемое результирующее число с очередным разрядом полученной цыфровой строки, предварительно умножив его на вес разряда (единицы - умножаем на 1, десятки - на 10, сотни - на 100, и т.д.)
Чтобы вывести число на экран нужно проделать обратную операцию: перевести число поразрядно в строку и конвертировать в ASCII-код.
Вывести получившуюся строку можно функцией 09h прерывания 21h:
Вход:
AH = 09h
DS:DX = сегмент и смещение выводимого строкового буфера, который должен оканчиваться терминатором '$'
Успехов!
--------- Стучитесь! И Вас откопают...
Ответ отправил: Sergijj (статус: 7-ой класс)
Ответ отправлен: 31.01.2007, 12:15
Отвечает: Олег Владимирович
Здравствуйте, Tiabc!
В приложении пример ввода/вывода целых десятичных чисел. Оформлены в виде процедур.
Удачи!
Приложение:
--------- Факультет ПМ-ПУ - лучший в СПбГУ!
Ответ отправил: Олег Владимирович (статус: Студент)
Ответ отправлен: 31.01.2007, 12:31
Отвечает: Зенченко Константин Николаевич
Здравствуйте, Tiabc!
code segment
start:
.186
assume cs:code,ds:data,es:data,ss:stac
;устанавливаем основные реистры
mov ax,seg data
mov bx,seg stac
mov ds,ax
mov es,ax
mov ss,bx
mov sp,offset top
;начинаем ввод
xor ax,ax
mov number,ax
mov ah,9
mov dx,offset input_text
int 21h
;вводим без эхо
L01: mov ah,08
int 21h
cmp al,0dh;контроль
jz stop
cmp al,'0';контроль диапазона чисел
jl L01;меньше 0
cmp al,'9';контроль диапазона чисел
jg L01;больше 9
;число
push ax
mov dx,number
and ax,000fh
shl dx,1;х2
jc over;контроль диапазона введенного числа
add ax,dx
shl dx,2;х4
jc over;контроль диапазона введенного числа
add ax,dx;="число"х10+"цыфра"
jc over;контроль диапазона введенного числа
mov number,ax
pop ax
int 29h;быстрый вывод
jmp short L01;
;сообщение об ошибке
over: mov dx,offset out_over
;вывод
output: mov ah,9
int 21h
;выход
exit: mov ah,4ch
int 21h
;преобразование числа из 16-го в упакованное 10-е
stop: finit
fild number
fbstp number_temp
;преобразование числа из упакованного 10-го в строку для вывода
mov di,offset output_number
mov si,offset number_temp+2
mov cx,3
L02: mov al,[si]
push ax
shr al,4
add al,'0'
mov [di],al
pop ax
inc di
dec si
and al,0fh
add al,'0'
mov [di],al
inc di
loop L02
inc di
mov al,'$'
mov dx,offset output_text
jmp short output
code ends
data segment
number dw ?
input_text db 13,10,'Введите число до 65535:$'
output_text db 13,10,'Ваше число :'
output_number db 6 dup(?),'$'
number_temp dt ?
out_over db 13,10,'Ваше число больше 65535$'
data ends
stac segment stack 'stack'
dw 100 dup(?)
top dw ?
stac ends
end start