Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Низкоуровневое программирование > Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 26.05.2011, 14:29   #1
Alex071
Пользователь
 
Аватар для Alex071
 
Регистрация: 26.05.2011
Сообщений: 19
По умолчанию Функции 02 и 09 прерывания 21h ничего не выводят

Здравствуйте! Написал простенькую программу для чтения и вывода имени файла из корнемого каталога дискеты.
Код:
.model TINY
.code
org 100h
start:
jmp begin
bla db 512 dup(?)
begin:
mov ah,2; номер функции
mov al,1; количество, которые нужно прочитать
mov ch,0; дорожка
mov dh,1; сторона
mov cl,2; сектор
mov bx,offset bla; куда прочитается сектор
int 13h
mov ah,09h;
mov dx,offset bla
mov [bla+11],'$';имя занимает 11 байт, поэтому здесь знак конца строки
int 21h
int 20h
end start
Проблема в том, что ничего не выводится, одни пробелы. В отладчике проверял, имя файла по адресу "offset bla" есть, есть и знак '$' в конце имени.
Пробовал и функцию 02 int 21h.
Код:
mov bx,104h ;явно указал адрес первой буквы названия (посмотрел в отладчике)
mov dx,[bx];запись этой буквы в dx
mov ah,02h
int 21h
И, конечно же, опять ничего не вывелось. Самое интересное, что в dx записалось значение первой буквы ('T'), но почему-то не вывелось. Пробовал по этому адресу дополнительно записывать символ 'T', тогда все нормально выводится, хотя все, что я сделал - просто перезаписал символ 'T'... Дискету подключал виртуально через WMware... Если у кого-нибудь есть идеи, почему так может быть, пожалуйста, отзовитесь!
Alex071 вне форума Ответить с цитированием
Старый 26.05.2011, 16:16   #2
xxxyyyzzz
Пользователь
 
Регистрация: 25.05.2011
Сообщений: 13
По умолчанию

я не спец, но по ходу надо настроить сегментный регистр ds? и если не ошибаюсь то это .com программа?
xxxyyyzzz вне форума Ответить с цитированием
Старый 26.05.2011, 18:42   #3
Alex071
Пользователь
 
Аватар для Alex071
 
Регистрация: 26.05.2011
Сообщений: 19
По умолчанию

да, это COM программа, а зачем ds то настраивать?
Alex071 вне форума Ответить с цитированием
Старый 26.05.2011, 18:50   #4
xxxyyyzzz
Пользователь
 
Регистрация: 25.05.2011
Сообщений: 13
По умолчанию

недавно резидент писал, строку на экран надо было выкинуть, при не настроенном ds выводился мусор, а после:
mov ax,cs
mov ds,ax
всё пучком!
xxxyyyzzz вне форума Ответить с цитированием
Старый 26.05.2011, 19:25   #5
Alex071
Пользователь
 
Аватар для Alex071
 
Регистрация: 26.05.2011
Сообщений: 19
По умолчанию

не, не помогает... да ведь в COM программе все сегментные регистры и так настроены одинаково. Самое главное то, что в dx при вызове функции 02h значение первой буквы правильно записано, но ничего не выводится... А если в dx просто число какое-нибудь пихнуть(например, аски код той же буквы), то все выведется нормально. Не понимаю, как такое может быть.
Alex071 вне форума Ответить с цитированием
Старый 26.05.2011, 19:50   #6
veniside
Старожил
 
Регистрация: 03.01.2011
Сообщений: 2,508
По умолчанию

имя файла не в юникоде случайно?

> Не понимаю, как такое может быть.

для кода символа используется 1 байт (DL) а не 2 (DX). Опять же, похоже, что

Цитата:
mov dx,[bx];запись этой буквы в dx
записывает в DX 2 байта, при этом в DL попадает 1 - признак юникодного имени, а в DH уже код символа.
"Когда приходит положенное время, человек перестаёт играть в пинбол. Только и всего."
veniside вне форума Ответить с цитированием
Старый 26.05.2011, 21:15   #7
vadimych
Форумчанин
 
Регистрация: 16.01.2011
Сообщений: 325
По умолчанию

Alex071, если я не ошибаюсь, в dl перед вызовом функции 2 int 13h должен быть указан номер диска: 0 - диск А, 1 - диск В и т.д.
vadimych вне форума Ответить с цитированием
Старый 26.05.2011, 21:17   #8
Alex071
Пользователь
 
Аватар для Alex071
 
Регистрация: 26.05.2011
Сообщений: 19
По умолчанию

Нет, имя не в юникоде. dx нечайно написал, но в dl все равно попадает правильное значение - 53h (код 'T'), проверял в отладчике. Смысл в том, что если еще дополнительно написать mov dl,53h (т.е. значение dl как было 53h, так и остается) то все выведется.. Такое ощущение, что показывает, что сектор с дискеты прочитался, а на самом деле не прочиталось нефига. Программу выполняю на виртуальной машине и сектор читаю с виртуальной дискеты. Может, здесь ключ проблемы..?

Последний раз редактировалось Alex071; 26.05.2011 в 21:21.
Alex071 вне форума Ответить с цитированием
Старый 26.05.2011, 22:01   #9
veniside
Старожил
 
Регистрация: 03.01.2011
Сообщений: 2,508
По умолчанию

> но в dl все равно попадает правильное значение - 53h (код 'T'), проверял в отладчике
> если еще дополнительно написать mov dl,53h

хм.. тогда или отладчик врёт, или одно из двух.

Осталось запустить что-то типа:

Код:
mov dx,[bx]
cmp dl, 053h
jz OK
notOK:
и посмотреть, перейдёт оно по метке ОК или нет.
"Когда приходит положенное время, человек перестаёт играть в пинбол. Только и всего."
veniside вне форума Ответить с цитированием
Старый 27.05.2011, 00:13   #10
Alex071
Пользователь
 
Аватар для Alex071
 
Регистрация: 26.05.2011
Сообщений: 19
По умолчанию

В отладчике строку пропускает, как и надо а если без него то не пропускает. Я в панике ))
Alex071 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
резидентная программа (обработка функции 9h прерывания 21h) Dimarik Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 2 25.02.2011 10:38
Ничего не пойму (Сокращенные функции) Язык С. Wisher717 Помощь студентам 7 25.01.2010 21:49