Отправляет email-рассылки с помощью сервиса Sendsay
  Все выпуски  

Ассемблер? Это просто! Учимся программировать


РАССЫЛКИ ПОРТАЛА RUSFAQ.RU

/ КОМПЬЮТЕРЫ И ПО / Языки программирования / Assembler (Ассемблер)

Выпуск № 674
от 05.02.2007, 12:05

Администратор:Калашников О.А.
В рассылке:Подписчиков: 379, Экспертов: 33
В номере:Вопросов: 1, Ответов: 3


Вопрос № 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
Ответ отправил: Зенченко Константин Николаевич (статус: 2-ой класс)
Ответ отправлен: 31.01.2007, 17:42


Отправить вопрос экспертам этой рассылки

Приложение (если необходимо):

* Код программы, выдержки из закона и т.п. дополнение к вопросу.
Эта информация будет отображена в аналогичном окне как есть.

Обратите внимание!
Вопрос будет отправлен всем экспертам данной рассылки!

Для того, чтобы отправить вопрос выбранным экспертам этой рассылки или
экспертам другой рассылки портала RusFAQ.ru, зайдите непосредственно на RusFAQ.ru.


Форма НЕ работает в почтовых программах The BAT! и MS Outlook (кроме версии 2003+)!
Чтобы отправить вопрос, откройте это письмо в браузере или зайдите на сайт RusFAQ.ru.


© 2001-2007, Портал RusFAQ.ru, Россия, Москва.
Идея, дизайн, программирование: Калашников О.А.
Email: adm@rusfaq.ru, Тел.: +7 (926) 535-23-31
ООО "Мастер-Эксперт Про", Москва, 2007
Авторские права | Реклама на портале
Версия системы: 4.43 beta от 26.01.2007
Яндекс Rambler's Top100

В избранное