Nowa, lepsza odsłona forum to połączenie forum.komputerswiat.pl, forum-gamezilla.komputerswiat.pl i forum.ks-ekspert.pl. Jeżeli miałeś konto na którymś z tych forów, mogą Cię dotyczyć zmiany nazwy nicka. Poczytaj o nich więcej.
Zaloguj się na konto
Zarejestruj się
4 odpowiedzi w tym temacie
#1
Napisano 05 April 2006 — 13:12
ELoracius
-
- Użytkownicy
-
- 113 postów
Użytkownik
- Płeć:Mężczyzna
- Lokalizacja:…inąd
- Hobby:Wszystko o projektowaniu WEB
Ten program ma dzielić liczbę podaną w zmiennej przez 1000, a następnie wypisać pierwszą jej cyfrę na ekran. Tylko dlaczego zamiast poprawnego wyniku mam jakieś dziwne krzaczki na ekranie i podany wyżej błąd?
.286 .model small .stack 100h .data zmienna dw 2374 .code start: mov ax,@data mov ds,ax mov dx,offset zmienna mov cx,1000 ;przez tyle dzielimy mov ax,dx ;dzielimy mov dx,0 div cx ;iloraz w rejestrze ax mov dx,ax mov ah,09h ;cyferka na ekran add dx,48 ;aby uzyskac kod ASCII cyfry int 21h koniec: mov ah,4ch mov al,0h int 21h end start end
-
0
- Do góry
#2
EPhisikus
Napisano 05 April 2006 — 14:01
EPhisikus
- Płeć:Mężczyzna
- Lokalizacja:Poznań
mov ah,09h ;cyferka na ekran add dx,48 ;aby uzyskac kod ASCII cyfry int 21h
Coś mi świta, że 09h to wyświetlanie ciągu znaków.
Nie jestem dobry z asm — poprawcie mnie. Mi się wydaje, że powinno być tak:
mov ah,2 mov dl,kod_ascii int 21h
Tak mi przyszło do głowy, bo ah=2, to wyświetla pojedyńcze znaki. (chciałeś jeden znak wyświetlić)
Jeżeli się mylę, to powiedzcie, bo asma używałem dawno temu
Użytkownik Phisikus edytował ten post 05 April 2006 — 14:04
-
0
- Do góry
#3
ELoracius
Napisano 05 April 2006 — 14:23
ELoracius
-
- Użytkownicy
-
- 113 postów
Użytkownik
- Płeć:Mężczyzna
- Lokalizacja:…inąd
- Hobby:Wszystko o projektowaniu WEB
Tak, o to mi chodziło, tylko nie wiem, jak ten wynik przenieść z ‘ax’ (tam jest wynik z dzielenia) do ‘dl’. Jak wogóle przenosić małe (chyba jednobajtowe) wartości z rejestrów 16 bitowych do 8 bitowych?
Użytkownik Loracius edytował ten post 05 April 2006 — 14:26
-
0
- Do góry
#4
ECyrkiel
Napisano 05 April 2006 — 15:56
ECyrkiel
- Płeć:Mężczyzna
- Lokalizacja:Lublin
Tak, o to mi chodziło, tylko nie wiem, jak ten wynik przenieść z ‘ax’ (tam jest wynik z dzielenia) do ‘dl’. Jak wogóle przenosić małe (chyba jednobajtowe) wartości z rejestrów 16 bitowych do 8 bitowych?
Wystarczy mov dl,al, przecież cała wartość ax nie wejdzie do dl
Użytkownik Cyrkiel edytował ten post 05 April 2006 — 15:56
-
0
- Do góry
#5
ELoracius
Napisano 05 April 2006 — 16:10
ELoracius
-
- Użytkownicy
-
- 113 postów
Użytkownik
- Płeć:Mężczyzna
- Lokalizacja:…inąd
- Hobby:Wszystko o projektowaniu WEB
W sumie już zdążyłem wpaść na to Wystarczy trochę pokumać. OK Dzinks!
-
0
- Do góry
-
Средства dos
Подавляющее
большинство программ содержат команды
вывода данных на экран. Текстовая система
DOS обеспечивает ряд функций
для вывода данных на экран в текстовом
режиме как на консоль терминала. При
этом экран представляет собой набор из
25 строк по 80 позиций в каждой (в большинстве
случаев). В каждой позиции может быть
отображен один из 256 символов кодовой
таблицы ASCII (по умолчанию
серым цветом на черном фоне). Строки
нумеруются с 1-й (верхняя) по 25-ю (нижняя).
Вывод осуществляется, начиная с текущей
позиции курсора; с выводом каждого
нового символа курсор смещается вправо
к следующей позиции. Если курсор находится
в последней позиции строки, вывод символа
приводит к переводу курсора в начало
новой строки. Если курсор находится в
предпоследней (25-й) строке, то его перевод
на следующую строку приводит к сдвигу
изображения на экране на строку вверх
(прокрутка экрана).
В DOS
имеются функции вывода одного символа
и строки символов на стандартное
устройство вывода STDOUT.
Обычно этим устройством является экран
компьютера. DOS позволяет
изменять стандартное устройство; при
этом говорят о перенаправлении вывода
данных на новое устройство, которым
может быть файл на диске, устройство,
подключенное к одному из коммуникационных
портов компьютера, пустое устройство
NULL или стандартный ввод
другой программы. Перенаправление
вывода при использовании командной
строки указывается с помощью символа
«>», разделяющего источник и
приемник данных. Например, если написать
в командной строке
dir
> files.txt
то на экран ничего
выдано не будет, а в текущей директории
появится файл
files.txt,
содержащий список файлов текущего
каталога.
В
дальнейшем предполагается использование
экрана в качестве устройства STDOUT.
Функции
DOS поддерживают интерпретацию управляющих
кодов. Это значит, что при выводе символов
с этими кодами на экран вместо
непосредственно вывода символов
производятся определенные управляющие
действия:
07h (BEL)
— звуковой сигнал (со стандартного
звукового устройства);
08h (BS)
— BackSpace (курсор сдвигается на 1 позицию
влево);
09h (HT)
— горизонтальная табуляция (курсор
сдвигается к ближайшей правой границе
табуляции);
0Ah = 10
(LF) — перевод строки (курсор сдвигается
на одну позицию вниз);
0Dh = 13
(CR) — возврат каретки (курсор сдвигается
в начало текущей строки).
Управляющие
коды дают возможность выводить на экран
форматированный текст.
При
перенаправлении вывода интерпретация
управляющих кодов может меняться.
Функция
2 выдает один символ, код которого
находится в регистре DL,
на экран в текущую позицию курсора.
Имеется возможность прервать работу
функции нажатием комбинации клавиш
Ctrl-Break (вызов
INT 23h).
Выходных параметров нет.
В
дальнейшем описание синтаксиса функций
будет приводиться в следующем виде:
Функция
№ — Название.
Ввод: <перечень
входных параметров>
Вывод: <перечень
выходных параметров>
Для
функции 2 оно будет выглядеть так:
Функция DOS 02h
— Записать символ в STDOUT с проверкой
на Ctrl-Break
Ввод: АН
= 02h
DL =
ASCII-код символа
Вывод: Нет.
В DOS
имеется почти аналогичная функция, не
реагирующая на Ctrl-Break:
Функция DOS 06h — Записать
символ в STDOUT без проверки на Ctrl-Break
Ввод: АН
= 06h
DL =
ASCII-код символа (кроме FFh)
Вывод: Нет.
Функция
6 может применяться как для вывода, так
и для ввода отдельных символов. Код FFh
соответствует режиму ввода, поэтому
при выводе его нельзя использовать.
Благодаря отсутствию проверки на
Ctrl-Break
выполнение функции обычным образом
прервать нельзя.
Функция DOS
09h — Записать
строку в STDOUT с проверкой
на Ctrl-Break
Ввод: АН
= 09h
DS:DX =
адрес строки, заканчивающейся символом
«$» (24h)
Вывод: Нет.
При
описании строки необходимо указать ее
полный адрес (сегмент:смещение).
Особенностью работы данной функции
является использование знака «$»
в качестве признака конца строки.
Ctrl-Break обрабатывается. Ниже приведен
пример использования функции:
message db ‘Некоторая
строка$’ ; выводимый текст
[.
. .]
mov ah,
9h ; функция
DOS 9h
вывода строки на экран
mov dx,
offset message ;
относительный адрес выводимой строки
int 21h ;
вызов DOS
Первая
команда примера (MOV АН, 9) помещает число
9, то есть номер функции DOS «вывод строки»,
в регистр АН. Следующая команда помещает
в регистр DX смещение (относительный
адрес) определенной выше строки MESSAGE
относительно начала сегмента, в котором
определена строка. Последняя команда
(INT 21h) вызывает функцию DOS. (Порядок
инициализации входных параметров
значения не имеет, но обычно команду,
определяющую номер вызываемой функции
ставят перед другими для наглядности).
Для
вывода строк также может использоваться
более общая функция 40h.
Она относится к функциям для работы
с файлами и позволяет выводить строки
в файл или устройство (например, на
экран).
Функция DOS 40h —
Записать строку в файл или устройство
Ввод: АН
= 40h
ВХ = 1
для STDOUT или 2 для STDERR
DS:DX =
адрес строки
СХ =
длина строки
Вывод: CF = 0, если
не было ошибок, АХ = число
записанных байт
На входе
(при вызове) ВХ должен содержать описатель
устройства для вывода, пара DS:DX — адрес
строки, а счетчик СХ — длину строки. На
выходе флаг CF показывает успешность
выполненной операции. Если CF
= 0 — операция вывода прошла успешно,
при этом регистр АХ содержит число
выведенных байт. Если CF
= 1, произошла ошибка при выводе, при этом
АХ содержит код ошибки.
Устройство
STDERR, в отличие от STDOUT,
всегда соответствует экрану и не
позволяет перенаправлять вывод в файл.
Оно предназначено для вывода сообщений
об ошибках, которые должны в любом случае
появляться на экране.
Так как
строка в данном случае определяется
адресом и длиной, она может содержать
все символы таблицы ASCII,
хотя управляющие коды при выводе будут
обрабатываться.
И
наконец, последняя функция DOS вывода на
экран, которая здесь рассматривается
— недокументированное прерывание 29h.
INT 29h — Быстрый вывод символа
на экран
Ввод: AL = ASCII-код символа
В
большинстве случаев INT 29h просто вызывает
функцию BIOS «вывод символа на экран в
режиме телетайпа», так что никаких
преимуществ, кроме экономии байт при
написании как можно более коротких
программ, она не имеет. Кроме того, нужно
иметь в виду, что использование
недокументированных средств данной
системы не гарантирует совместимости
программы с будущими версиями системы
(впрочем, полной гарантии нет в любом
случае).
Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]
- #
- #
- #
- #
- #
- #
- #
- #
- #
- #
17.12.2018436.22 Кб7t3.doc
- #
rokorok 0 / 0 / 0 Регистрация: 11.02.2011 Сообщений: 36 |
||||
1 |
||||
10.04.2012, 14:14. Показов 6338. Ответов 9 Метки нет (Все метки)
Здравствуйте! Моя задача: написать прогу, считывающую число в слово и по-разному выводящее его. У меня Win x64, ассемблер — MASM 5.1. Проблема со вводом строки: использую функцию 0Ah 21-ого прерывания, запускаю в Dosbox, но программа не ждёт, пока я что-то введу, а сразу идёт дальше. Можно ли это как-то побороть?
__________________
0 |
650 / 337 / 37 Регистрация: 04.04.2012 Сообщений: 886 |
|
10.04.2012, 18:17 |
2 |
Посмотрел в отладчике. Первый байт в буфере содержит максимальное число символов. После выполнения прерывания, во второй байт буфера записывается число введенных символов минус ентер. Ентер записывается тоже.
0 |
2 / 2 / 0 Регистрация: 12.02.2011 Сообщений: 55 |
|
10.04.2012, 18:23 |
3 |
поместите в первый байт колличество вводимых символов Добавлено через 1 минуту
0 |
zzzyyyxxx 766 / 310 / 11 Регистрация: 27.05.2011 Сообщений: 703 |
||||
10.04.2012, 18:31 |
4 |
|||
Сообщение было отмечено как решение Решение
0 |
650 / 337 / 37 Регистрация: 04.04.2012 Сообщений: 886 |
|
10.04.2012, 19:30 |
5 |
Кстати, выводимая на экран строка затрет введенную с клавиатуры. Покажется, что вывода вообще не было. Что бы этого избежать, надо перед выводом строки, вывести на экран символы перевод строки, возврат каретки (10,13 (0Ah,0Dh)) Код MOV AH, 0Ah LEA DX, BUF INT 21H mov si,dx xor ax,ax mov al,[si+1] ;число введенных символов add si,ax ;сдвинуть указатель на конец строки mov byte ptr [si+2],'$' ;записать в конец строки с учетом первых двух байт inc dx ;пропустить два первых байта и вывести строку inc dx MOV AH, 9 INT 21H
0 |
0 / 0 / 0 Регистрация: 11.02.2011 Сообщений: 36 |
|
10.04.2012, 20:39 [ТС] |
6 |
zzzyyyxxx, огромное спасибо, всё заработало, только не понятно два момента:
0 |
766 / 310 / 11 Регистрация: 27.05.2011 Сообщений: 703 |
|
10.04.2012, 20:49 |
7 |
1) зачем при объявлении строки в DUP указывать символ на 1 больше, чем максимальный? в последнем будет хранится ‘$’, т.е. вывод будет осуществлён до этого символа.. если меньше, то будет велика вероятность вывода мусора..
2) что значит строка mov byte ptr ds:[BUF+1],0ah? первые два байта твоей строки будут отведены, для тех характер вводимого массива: т.к. эти характеристики нам более не нужны, пишем inc di, т.е. переводим указатель на 2(1)-ой байт, его же в свою очередь затираем символом перехода на новую строку и выводим.. надеюсь понятно изложил?
0 |
0 / 0 / 0 Регистрация: 11.02.2011 Сообщений: 36 |
|
10.04.2012, 21:03 [ТС] |
8 |
zzzyyyxxx, очень понятно. Только, если понял устройство строки для данной функции ввода, то первым символом у нас стоит 10, потом идёт строка, а потом идёт 13. Всегда ли тогда будет правильный переход на новую строку?
0 |
766 / 310 / 11 Регистрация: 27.05.2011 Сообщений: 703 |
|
10.04.2012, 21:13 |
9 |
ну ты сам формируешь, если надо, то перед сторокой можешь переход на новую сделать, если не надо, dx ещё раз увеличиваешь на 1 и всё пучком, короче зависит от ситуации…
0 |
0 / 0 / 0 Регистрация: 11.02.2011 Сообщений: 36 |
|
10.04.2012, 21:17 [ТС] |
10 |
zzzyyyxxx, теперь всё ясно, спасибо.
0 |
IT_Exp Эксперт 87844 / 49110 / 22898 Регистрация: 17.06.2006 Сообщений: 92,604 |
10.04.2012, 21:17 |
Помогаю со студенческими работами здесь If и For в DOSBox DosBox DosBox Command.com и DosBox Настройка DosBox Int 20 в dosbox Искать еще темы с ответами Или воспользуйтесь поиском по форуму: 10 |