Атрибуты файла, ассемблер |
1. Заголовок или название темы должно быть информативным
2. Все тексты программ должны помещаться в теги [CODE=asm] [/CODE]
3. Прежде чем задавать вопрос, см. "FAQ",если там не нашли ответа, воспользуйтесь ПОИСКОМ, возможно, такую задачу уже решали!
4. Не предлагайте свои решения на других языках, кроме Ассемблера. Исключение только с согласия модератора.
5. НЕ используйте форум для личного общения! Все, что не относиться к обсуждению темы - на PM!
6. Проверяйте программы перед тем, как выложить их на форум!!
Атрибуты файла, ассемблер |
Rocket |
15.02.2009 23:50
Сообщение
#1
|
Знаток Группа: Пользователи Сообщений: 306 Пол: Мужской Реальное имя: Евгений Репутация: 0 |
Доброго времени суток! У меня тут заданьеце : вывести атрибуты файла, в диалоговой форме произвести переустановку атрибутов. Реализовал первую часть - вывод атрибутов, использую функцию 43h прерывания 21h. Но возникает какая-то ошибка при вызове прерывания. В чём проблема?
|
volvo |
16.02.2009 0:20
Сообщение
#2
|
Гость |
Ну, наверное все-таки
path db "E:/data.txt",0 ; прямой слеш |
Rocket |
16.02.2009 20:31
Сообщение
#3
|
Знаток Группа: Пользователи Сообщений: 306 Пол: Мужской Реальное имя: Евгений Репутация: 0 |
Ну, наверное все-таки path db "E:/data.txt",0 ; прямой слеш Исправил эти мелкие огрехи, но появилась более существенная ошибка - всё время выводится последние сообщение, по-видимому, в cx не то что нам нужно...
p.s. А как в far manager'е можно посмотреть атрибуты? |
volvo |
16.02.2009 20:43
Сообщение
#4
|
Гость |
Цитата А как в far manager'е можно посмотреть атрибуты? Ctrl+A...Программу сейчас гляну... |
volvo |
16.02.2009 21:25
Сообщение
#5
|
Гость |
Так... А в программе-то у тебя ошибка в том, что ты сравниваешь значения, а надо проверять биты, маску то есть... Вот так, например (не стал ничего оптимизировать, чтоб был понятен принцип):
data segment |
Rocket |
17.02.2009 22:09
Сообщение
#6
|
Знаток Группа: Пользователи Сообщений: 306 Пол: Мужской Реальное имя: Евгений Репутация: 0 |
Так, исправил следующем образом:
Добавил проверку на атрибут "читать и записывать файл без ограничения", то есть 00h, но программа его игнорирует...почему? |
volvo |
17.02.2009 22:12
Сообщение
#7
|
Гость |
Где ты выкопал этот 00h, не расскажешь? Документация DOS знает только те маски, которые я тебе показал. Не надо ничего выдумывать... С точки зрения DOS 00h означает отсутствие каких-либо атрибутов.
|
Rocket |
17.02.2009 22:15
Сообщение
#8
|
Знаток Группа: Пользователи Сообщений: 306 Пол: Мужской Реальное имя: Евгений Репутация: 0 |
Где ты выкопал этот 00h, не расскажешь? Документация DOS знает только те маски, которые я тебе показал. Не надо ничего выдумывать... мм...тогда сорри, просто в методичке, в которой изложено данное задание, приведён ещё и этот атрибут... Так сейчас буду практиковаться в изменении атрибутов |
volvo |
17.02.2009 22:16
Сообщение
#9
|
Гость |
P.S.
and ax,0000hты на самом деле надеешься, что после AND с 0000h когда-нибудь будет ненулевой результат??? CMP или TEST использовать не пробовал? |
Rocket |
17.02.2009 22:27
Сообщение
#10
|
Знаток Группа: Пользователи Сообщений: 306 Пол: Мужской Реальное имя: Евгений Репутация: 0 |
|
Rocket |
17.02.2009 23:53
Сообщение
#11
|
Знаток Группа: Пользователи Сообщений: 306 Пол: Мужской Реальное имя: Евгений Репутация: 0 |
Вот пытаюсь произвести установку атрибута "read only":
Процедура showAtr вызывается только один - при первом вызове... и при изменении атрибута, все остальные сбрасываются... p.s. Данной функцией производится как установка, так и сброс атрибутов? |
volvo |
18.02.2009 1:10
Сообщение
#12
|
Гость |
Цитата Данной функцией производится как установка, так и сброс атрибутов? Естественно, ты устанавливаешь комбинацию атрибутов, задавая ее содержимым CX... Нулевые биты сбрасываются, единичные - выставляются... Если ты хочешь именно добавить атрибут - тоmov ah, 43h |
Rocket |
19.02.2009 21:34
Сообщение
#13
|
Знаток Группа: Пользователи Сообщений: 306 Пол: Мужской Реальное имя: Евгений Репутация: 0 |
Естественно, ты устанавливаешь комбинацию атрибутов, задавая ее содержимым CX... Нулевые биты сбрасываются, единичные - выставляются... Если ты хочешь именно добавить атрибут - то mov ah, 43h А как тогда сбросить, and'ом? остальные атрибуты не изменятся при этом? |
volvo |
19.02.2009 22:10
Сообщение
#14
|
Гость |
Цитата А как тогда сбросить, and'ом? остальные атрибуты не изменятся при этом? Ага, and-ом, только не просто and-ом, а:mov ah, 43h |
Rocket |
19.02.2009 23:55
Сообщение
#15
|
Знаток Группа: Пользователи Сообщений: 306 Пол: Мужской Реальное имя: Евгений Репутация: 0 |
Теперь мне нужно сделать, чтоб всё это работало в диалоговой форме.
Как сделать, чтоб при нажатии соответствующей кнопки, устанавливался/сбрасывался атрибут? то есть своеобразный case организовать... а вот проверку установить\сбросить атрибут опять же через and + условие jz ? Вот зачатки всего этого (меню пока что)
|
volvo |
20.02.2009 0:45
Сообщение
#16
|
Гость |
Цитата Как сделать, чтоб при нажатии соответствующей кнопки, устанавливался/сбрасывался атрибут? На самом деле все просто:; вывел меню, я здесь не делал никаких проверок на то, какие клавиши нажимались... Добавь там проверку, после чтения с клавиатуры, что нажата одна из кнопок '1' .. '6', чтоб не было никаких неожиданностей... |
Rocket |
20.02.2009 19:24
Сообщение
#17
|
Знаток Группа: Пользователи Сообщений: 306 Пол: Мужской Реальное имя: Евгений Репутация: 0 |
Вот, что у меня получилось:
...а скорей не получилось : при нажатии клавиши возникает ошибка и работа программы прекращается. Я сделал без вот этого момента : - не особо понял, что здесь происходит. |
volvo |
20.02.2009 20:36
Сообщение
#18
|
Гость |
Цитата Я сделал без вот этого момента : А что ж ты сделал тогда? Что за привычка - ВЫБРОСИТЬ все, что не понял, а потом сказать, что программа не работает?Как ты хочешь менять значение определенного атрибута на противоположное? Чтобы это сделать, надо дождаться от пользователя решения, какой атрибут менять, потом перейти к соответствующему биту (для атрибута RO - это нулевой, самый младший бит, LSB как говорится; для атрибута Hidden - первый, для System - второй, и т.д.), проверить его текущее состояние, если он сейчас установлен, то сбросить, если НЕ установлен - установить. Так? Продолжаем.. Как проверить бит, соответствующий данному атрибуту? Для начала, надо получить номер бита, начиная с 0. Получили, что дальше? Создаем маску для нужного бита: значение 0001h надо сдвинуть влево на столько, какой бит мы проверяем. Вот это и делается в нижеследующих строках: mov cl, al ; Не забыл, в AL у тебя номер бита, который надо поменять ... Теперь у нас в AX - маска, с единицей ТОЧНО в том же месте, где находится изменяемый бит атрибута... Кстати, твою программу можно сократить значительно, ты бы макросы что-ли задействовал? У тебя ж одно и то же делается 6 раз подряд... И вот этого я не говорил, ты сам это придумал: Цитата mov ah,al |
Rocket |
20.02.2009 23:17
Сообщение
#19
|
Знаток Группа: Пользователи Сообщений: 306 Пол: Мужской Реальное имя: Евгений Репутация: 0 |
А что ж ты сделал тогда? Что за привычка - ВЫБРОСИТЬ все, что не понял, а потом сказать, что программа не работает? Как ты хочешь менять значение определенного атрибута на противоположное? Чтобы это сделать, надо дождаться от пользователя решения, какой атрибут менять, потом перейти к соответствующему биту (для атрибута RO - это нулевой, самый младший бит, LSB как говорится; для атрибута Hidden - первый, для System - второй, и т.д.), проверить его текущее состояние, если он сейчас установлен, то сбросить, если НЕ установлен - установить. Так? Продолжаем.. Как проверить бит, соответствующий данному атрибуту? Для начала, надо получить номер бита, начиная с 0. Получили, что дальше? Создаем маску для нужного бита: значение 0001h надо сдвинуть влево на столько, какой бит мы проверяем. Вот это и делается в нижеследующих строках: mov cl, al ; Не забыл, в AL у тебя номер бита, который надо поменять ... Теперь у нас в AX - маска, с единицей ТОЧНО в том же месте, где находится изменяемый бит атрибута... Кстати, твою программу можно сократить значительно, ты бы макросы что-ли задействовал? У тебя ж одно и то же делается 6 раз подряд... И вот этого я не говорил, ты сам это придумал: В общем, перечитывай еще раз мой предыдущий пост. Там кусок из ОТРАБОТАВШЕЙ программы. Понимаешь? Она работает, а не должна бы работать... Вот и разберись, как она работает... Убрал порцию нездоровой отсебятины, перечитал ещё пару раз пост...и всё заработало наилучшим образом! Спасибо) |
Текстовая версия | 24.09.2024 9:05 |