Dos setblock 4ah error

[ASM] Błąd: DOS SETBLOCK (4Ah) error - napisał w Programowanie: 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 a...

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żytkownik

  • Użytkownicy
  • Pip

  • 113 postów
  • 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 :D

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żytkownik

  • Użytkownicy
  • Pip

  • 113 postów
  • 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żytkownik

  • Użytkownicy
  • Pip

  • 113 postów
  • Płeć:Mężczyzna
  • Lokalizacja:…inąd
  • Hobby:Wszystko o projektowaniu WEB

W sumie już zdążyłem wpaść na to :P Wystarczy trochę pokumać. OK Dzinks!

  • 0

  • Do góry


      1. Средства 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
09
hЗаписать
строку в 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, но программа не ждёт, пока я что-то введу, а сразу идёт дальше. Можно ли это как-то побороть?

Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
STACK SEGMENT STACK
    DB 1000 DUP (?)
STACK ENDS
 
DATA SEGMENT 'DATA' 
    X DW ?
    BUF db 9, 9 dup(?)
DATA ENDS
 
CODE SEGMENT 'CODE'
    ASSUME CS:CODE,DS:DATA
ENTRY:
    MOV AH,2
    MOV DL,'>'
    INT 21h
 
    MOV AH, 0Ah
    LEA DX, BUF
    INT 21H
    MOV AH, 9
    INT 21H
    MOV AH,4Ch
    INT 21h
CODE ENDS
 
END ENTRY

__________________
Помощь в написании контрольных, курсовых и дипломных работ, диссертаций здесь



0



650 / 337 / 37

Регистрация: 04.04.2012

Сообщений: 886

10.04.2012, 18:17

2

Посмотрел в отладчике. Первый байт в буфере содержит максимальное число символов. После выполнения прерывания, во второй байт буфера записывается число введенных символов минус ентер. Ентер записывается тоже.
Получается, что если нужно ввести 5 символов, то буфер должен быть размером 7 байт.



0



2 / 2 / 0

Регистрация: 12.02.2011

Сообщений: 55

10.04.2012, 18:23

3

поместите в первый байт колличество вводимых символов
допустим 40
mov BUF,40

Добавлено через 1 минуту
и еще могут возникнут не понятики с выводом на экран. т. к. 9я функция 21го прерывания выводит все что встретит до символа ‘$’



0



zzzyyyxxx

766 / 310 / 11

Регистрация: 27.05.2011

Сообщений: 703

10.04.2012, 18:31

4

Лучший ответ Сообщение было отмечено как решение

Решение

Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
DATA SEGMENT 'DATA' 
    X DW ?
    BUF db 9,?, 10 dup('$')
DATA ENDS
 
CODE SEGMENT 'CODE'
ENTRY:
    mov ax,data
    mov ds,ax
 
    MOV AH,2
    MOV DL,'>'
    INT 21h
 
    MOV AH, 0Ah
    LEA DX, BUF
    INT 21H
    mov byte ptr ds:[BUF+1],0ah
    MOV AH, 9
    inc dx
    INT 21H
    
    MOV AH,4Ch
    INT 21h
CODE ENDS
END ENTRY



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, огромное спасибо, всё заработало, только не понятно два момента:
1) зачем при объявлении строки в DUP указывать символ на 1 больше, чем максимальный?
2) что значит строка mov byte ptr ds:[BUF+1],0ah?
Как я понял, эти два пункта связаны. В самом конце строки у нас записан код Enter’а, а вслед за ним мы дописываем код 10, чтобы сделать переход на новую строку. Но тогда мне не понятно, по какому принципу он выводит строку, если будет записано меньше максимума символов?



0



766 / 310 / 11

Регистрация: 27.05.2011

Сообщений: 703

10.04.2012, 20:49

7

Цитата
Сообщение от rokorok
Посмотреть сообщение

1) зачем при объявлении строки в DUP указывать символ на 1 больше, чем максимальный?

в последнем будет хранится ‘$’, т.е. вывод будет осуществлён до этого символа.. если меньше, то будет велика вероятность вывода мусора..

Цитата
Сообщение от rokorok
Посмотреть сообщение

2) что значит строка mov byte ptr ds:[BUF+1],0ah?

первые два байта твоей строки будут отведены, для тех характер вводимого массива:
1) кол-во байт для ввода, не более..
2) фактич кол-во, т.е. сколько ввёл..
3) и далее, твой массив..

т.к. эти характеристики нам более не нужны, пишем 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 она будет работать по сети?то бишь программа будет…

DosBox
Можно ли как-нибудь скопировать файлы(command.com и т.д) из программы dosbox, досовскими командами…

Command.com и DosBox
При запуске command.com -&gt;&gt;&gt;Exit to error: unhandled dos 21 call 53

Настройка DosBox
Пересмотрела множество страниц по настройке DosBox, но у меня все равно не получается. Я запуталась…

Int 20 в dosbox
Помогите пожалуйста с программой. Как реализовать int 20 в данном коде. Если int 20 встречается…

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:

10

Понравилась статья? Поделить с друзьями:
  • Dos read error 43110081
  • Dos error pascal
  • Dos error errno 1455
  • Dos error code 2
  • Dos error 4 dosbox