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

RusFAQ.ru: программирование на языке Assembler


Информационный Канал Subscribe.Ru

RusFAQ.ru: программирование на языке Assembler

Выпуск № 545
от 17.05.2003, 11:10

Администратор:
Имя: Калашников О.А.
URL: Информационный ресурс
ICQ: 68951340
Россия, Москва
О рассылке:
Задано вопросов: 3229
Отправлено ответов: 9446
Активность: 292.5 %
[Задать вопрос >>][Регистрация эксперта >>]
[Поиск в базе][Обсудить на форуме]


 Список экспертов, ответы которых опубликованы в данном выпуске

Broken Sword
Статус: Профессиональный
Общий рейтинг: 122.89
URL: моя рассылка по Protected Mode
[Подробней >>]
Lynx
Статус: Опытный
Общий рейтинг: 137.76
[Подробней >>]
Knignick
Статус: Доверительный
Общий рейтинг: 113.15
[Подробней >>]
 
akul
Статус: Опытный
Общий рейтинг: 111.08
Телефон: +6019-6416245
[Подробней >>]
Ayl
Статус: Профессиональный
Общий рейтинг: 119.08
[Подробней >>]
Bob Johnson
Статус: Профессиональный
Общий рейтинг: 150.35
URL: Программирование
[Подробней >>]
 
_vt
Статус: Доверительный
Общий рейтинг: 121.18
[Подробней >>]
Pin
Статус: Доверительный
Общий рейтинг: 125.65
[Подробней >>]
baldr
Статус: Профессиональный
Общий рейтинг: 112.47
URL: Сайт об ОС DOS. Всем, кто любит эту ОС!
[Подробней >>]
 
masquer
Статус: Профессиональный
Общий рейтинг: 139.24
[Подробней >>]
ASMодей
Статус: Профессиональный
Общий рейтинг: 115.12
[Подробней >>]
Eugene
Статус: Профессиональный
Общий рейтинг: 108.58
URL: мощный файловый архив
[Подробней >>]
 
Ramzes
Статус: Опытный
Общий рейтинг: 127.81
URL: Microsoft homepage
[Подробней >>]
DiGiT[old]
Статус: Профессиональный
Общий рейтинг: 111.62
[Подробней >>]
Tigran K. Kalaidjian
Статус: Опытный
Общий рейтинг: 116.42
URL: Методы оптимизации работы ПК
[Подробней >>]


 Краткий перечень вопросов

Вопрос № 3186. Здравствуйте, уважаемые Эксперты. Только недавно начал изучать Assembler и сразу возникла проблема: ... (ответов: 2)
Вопрос № 3187. Доброе время суток! Уточнения на прошлое письмо. Есть программка написанная под DOS, она выводит тек... (ответов: 5)
Вопрос № 3188. Уважаемые эксперты помогите решить проблемму!!! ; (a - b) / a + 1 esli a>b ;Y = 25 esli a=b ; (a ... (ответов: 4)
Вопрос № 3189. почему я не могу зайти на kalashnikoff.ru мне пишут, что не такой страницы... (ответов: 3)
Вопрос № 3190. Уважаемые экмперты помогите разрешить вот такую проблему: Мне нужно в BorlandC++ 3.1 записать в реги... (ответов: 7)
Вопрос № 3191. КИТАЙСКАЯ MANTRA ТОТЕМ УДАЧИ. Вы можете не верить в это, но советы великолепны! Прочитайте все нижес... (ответов: 3)
Вопрос № 3193. Хаюшки! Господа эксперты, очень нужна 1 вещь: серийник к драйве студио 2.6 (нигде не могу найти!Подс... (ответов: 1)
Вопрос № 3194. Хай, эксперты! Тут ответ проскальзывал, что отладчик Wdasm, хороший. А чем он хорош? И еще, можно ли... (ответов: 1)
Вопрос № 3195. Привет, Broken Sword! Я хочу спросить по одному моменту в твоей рассылке: Начало каталога страниц... (ответов: 1)
Вопрос № 3196. Здравствуйте Эксперты! У меня тут беда. Надо в Вузе лабы сдавать, а я не знаю как одну задачку решит... (ответов: 7)
Вопрос № 3197. Здравствуйте, эксперты. Как работать с битами? Я создаю файловую оболочку DOS. Есть переменная, кото... (ответов: 8)

Вопросов: 11, ответов: 42


 Вопрос № 3186

Здравствуйте, уважаемые Эксперты.
Только недавно начал изучать Assembler и сразу возникла проблема: ставлю SoftIce 4.05 на Win98 Se, установка проходит нормально, но после запуска SoftIce(нажимаю Ctrl+D), при движении мышкой, последняя начинает беситься: бегает из угла в угол. Мышь оптическая, подключена к PS/2.
Не знаю даже, что и делать. Подскажите, пожалуйста. Заранее всем огромное спасибо.



Вопрос отправлен: 12.05.2003, 12:07
Отправитель: dmryb

[Следующий вопрос >>] [Список вопросов]

Отвечает Broken Sword

Приветствую Вас, dmryb!
делаешь так - когда мышь начинает бесится жми Ctrl+M (возможно несколько раз), если не помогло - отруби ее нахрен, уверяю тебя - в отладчиках класса SoftICE мышь выполняет роль пятого колеса в телеге, все намного быстрее можно реализовать руками (ну разве что кроме Copy/Paste, но эта операция тебе НИКОГДА не понадобиться)

Ответ отправлен: 12.05.2003, 14:40
Отправитель: Broken Sword


Отвечает Lynx

Приветствую Вас, dmryb!
Ну ты даёшь... Только начал асм изучать и сразу за СофтАйс. :))) Как с твоей проблемос справиться не знаю, могу только посоветовать отключить поддержку мышки в SI.


Ответ отправлен: 12.05.2003, 15:16
Отправитель: Lynx


 Вопрос № 3187

Доброе время суток!
Уточнения на прошлое письмо.
Есть программка написанная под DOS, она выводит текст на экран.
Необходимо что бы эта программка в процессе работы, САМА! скапировала данные с экрана и поместила их файл.
Я думаю это что то связанно с видеобуфером.
И если есть какой мануал (рус.) буду благодарен если намылите по адресу sde_@mail.ru
Денис



Вопрос отправлен: 12.05.2003, 16:58
Отправитель: Denis

[Следующий вопрос >>] [Список вопросов]

Отвечает Knignick

Здравствуйте, Denis!
Данные видепамяти располагаются начиная с сегментного адреса 0B800 так что скопировать данные программа твоя может запросто. Прямо побайтово (через один) начиная с b800:0000 записывай в файл (через один, потому как после каждого символа идет его атрибут(цвет))


Ответ отправлен: 13.05.2003, 00:25
Отправитель: Knignick


Отвечает akul

Добрый день, Denis!
Ну тут 2 варианта:
1й, сразу же дублировать вывод на экран выводом в файл. Под досом очень удобно через потоки. Или же потом читать видеопамять. Если в текстовом режиме то b8000h и оттуда 4 кб. 1й байт собственно символ, 2й - цветовой аттрибут.

Ответ отправлен: 13.05.2003, 10:45
Отправитель: akul


Отвечает Ayl

Приветствую Вас, Denis!
Ты правильно думаешь, что это связано с видеобуфером.
Насколько я понял, ты пишешь программу под DOS, которая что-то выводит на экран и потом тебе нужно это вывести в файл.
Тогда тебе точно известен режим, в котором находится экран. Допустим, что он текстовый, №3 (80*25, 16 цветов, 4 страницы). Тогда:
Начальный адрес видеобуфера равен B800:0000. Имеется 4 страницы для отображения, каждая размером 4000 байт. Смещение страницы N в видеосегменте (B800) определяется как 4096*N или 1000h*N.
Далее. Каждый отображаемый на экране символ занимает в видеобуфере 2 байта. Первый байт (по четному смещению) - это, собственно, сам символ; второй - атрибут, показывающий, каким именно образом нужно отображать его на экране.
Таким образом, чтобы записать в файл содержимое экрана, тебе нужно просто сделать следующее:
1. Определить смещение текущей страницы в видеобуфере (VOff)
2. Скопировать в файл 4000 байт, начиная с адреса B800:VOff
Если же тебе не нужно сохранять атрибуты, а только символы - то тоже все просто. Заводишь буфер на 2000 байт и копируешь в него содержимое видеобуфера только по четным адресам. Потом буфер записываешь в файл.

Ответ отправлен: 12.05.2003, 17:50
Отправитель: Ayl


Отвечает Bob Johnson

Приветствую Вас, Denis!
Да это очень просто - берешь видеобуфер, расположенный по адресу 0B800h:00000h и копируешь оттуда каждый второй байт (т.к. там еще цвет есть) к себе в буфер, а затем буфер записываешь в файл.


Ответ отправлен: 12.05.2003, 20:21
Отправитель: Bob Johnson


Отвечает _vt

Здравствуйте, Denis!
Для текстового режима 80x25 данные, отображаемые на экране, находятся в видеопамяти начиная с адреса 0b800h:0000h, оттуда и надо считывать символы в файл. Подробно смотри в рассылке "Ассемблер? Зто просто!", скачать можно с http://rusfaq.ru

Ответ отправлен: 13.05.2003, 23:17
Отправитель: _vt


 Вопрос № 3188

Уважаемые эксперты помогите решить проблемму!!!
; (a - b) / a + 1 esli a>b
;Y = 25 esli a=b
; (a - 5) / b esli a.model medium
.stack 30
.data
a dw 10
b dw 15
temp dw 0
.code
.startup
mov ax,a
cmp ax,b
ja m1
je m2
mov ax,a
sub ax,5
idiv b //devide error
mov temp,ax
jmp out
m1: mov ax,a
sub ax,b
mov bx,a
add bx,1
idiv bx //devide error
mov temp,ax
jmp out
m2: mov ax,25
mov temp,ax
jmp out
out: mov ah,8 ;getch
int 21h
.exit 0
end
У меня при любом делении в данной программе происходит ошибка DEVIDE ERROR хотя в регистрах находятся нормальные значения помогите ПЛЗ!!!! Если можно подкиньте полностью рабочую программу!!!!



Вопрос отправлен: 12.05.2003, 17:03
Отправитель: Lamer (hit_@ukr.net)

[Следующий вопрос >>] [Список вопросов]

Отвечает Pin

Добрый день, Lamer!
Не знаю: каким ассемблером ты пользуешься, но попробуй загрузить делитель в регистр и использовать именно его:
mov bx, b
div bx

Ответ отправлен: 13.05.2003, 00:25
Отправитель: Pin


Отвечает Knignick

Приветствую Вас, Lamer!
У тебя тут деление на слово имеет место, а регистр dx, где находится старшая часть делимого не инициализирован. Так что, возможно, частное в AX просто не помещается.
Попробуй xor DX, DX перед делением или уменьш размер операнда b до байта: b db 15


Ответ отправлен: 13.05.2003, 12:46
Отправитель: Knignick


Отвечает Ayl

Доброе время суток, Lamer!
Все дело в том, что idiv для деления использует двойной размер делимого по отношению к делителю. Т.е. если размер делителя - байт, то размер делимого - слово. Если же слово - то двойное слово. Двойное слово располагается в регистрах DX:AX. Но так как DX при старте программы равно сегменту PSP, то при делении DX:AX на малое число результат оказывается слишком большим. Чтобы программа заработала, нужно выполнить в начале программы только одну команду: xor dx, dx. И тогда все должно заработать.

Ответ отправлен: 12.05.2003, 18:03
Отправитель: Ayl


Отвечает Bob Johnson

Приветствую Вас, Lamer!
Idiv использует пару dx:ax как делимое. Тебе перед делением нужно выполнить cwd - оно заполнит dx верным значением.


Ответ отправлен: 12.05.2003, 20:22
Отправитель: Bob Johnson


 Вопрос № 3189

почему я не могу зайти на kalashnikoff.ru
мне пишут, что не такой страницы



Вопрос отправлен: 12.05.2003, 17:04
Отправитель: Gridmal

[Следующий вопрос >>] [Список вопросов]

Отвечает Ayl

Здравствуйте, Gridmal!
Ну потому что нет такой страницы. Теперь все на www.rusfaq.ru

Ответ отправлен: 12.05.2003, 18:13
Отправитель: Ayl


Отвечает baldr

Здравствуйте, Gridmal!
Олег этот сайт уже не поддерживает...
Все, что осталось - на rusfaq.ru или на сайте Bob Johnsonа!

Ответ отправлен: 12.05.2003, 19:09
Отправитель: baldr


Отвечает Bob Johnson

Здравствуйте, Gridmal!
Вот поэтому и не можешь... Странный вопрос... Нет ее больше. А что тебе нужно? Архив рассылки есть у меня на странице, все остальное - на русфаке.


Ответ отправлен: 12.05.2003, 20:22
Отправитель: Bob Johnson


 Вопрос № 3190

Уважаемые экмперты помогите разрешить вот такую проблему:
Мне нужно в BorlandC++ 3.1 записать в регистр AX значение I элемента массива т.е
void main()
{
int mas[5]={0,1,2,3,4};
_asm{
mov si,3//Третий элемент массива
mov ax,mas[si] //Записать в АХ число 2 (Неработает)
}
}
Помогите записать в AX необходимое мне число (Подкиньте исходник)!!!



Вопрос отправлен: 12.05.2003, 17:01
Отправитель: Lamer (hit_@ukr.net)

[Следующий вопрос >>] [Список вопросов]

Отвечает Pin

Добрый день, Lamer!
Всегда можно извернуться так:
void main()
{
__int16 temp; //Временная переменная
__int16 mas[5]={0,1,2,3,4};
temp = mas[1]
_asm{
mov ax,temp //Записать в АХ число (Работает)
}
}


Ответ отправлен: 13.05.2003, 00:22
Отправитель: Pin


Отвечает Knignick

Приветствую Вас, Lamer!
Ну, вообще-то в C/C++ элементы массива нумеруются, начиная с 0, т.е. третий с начала элемент имеет номер 2.


Ответ отправлен: 13.05.2003, 00:11
Отправитель: Knignick


Отвечает masquer

Доброе время суток, Lamer!
lea si, mas
mov ax, 3
mov ax, [si+ax*2]; *2 потому что integer


Ответ отправлен: 12.05.2003, 17:35
Отправитель: masquer


Отвечает Ayl

Здравствуйте, Lamer!
Встроенный ассемблер, конечно, рульная вещь, но с массивами работать не умеет. В смысле, что не производит автоматической настройки на размер элементов. У тебя массив целый чисел. Размер одного элемента - 2 байта. Соответственно, тебе нужно индекс увеличить в 2 раза и только потом считывать элемент:
_asm {
mov si, 3
shl si, 1
mov ax, mas [si]
}

Ответ отправлен: 12.05.2003, 18:16
Отправитель: Ayl


Отвечает Lynx

Приветствую Вас, Lamer!
Попробуй так:
int mas[5]={0,1,2,3,4};
_asm{
mov si, offset mas
mov ax, ds:[si+2]
}

Ответ отправлен: 12.05.2003, 19:40
Отправитель: Lynx


Отвечает Bob Johnson

Здравствуйте, Lamer!
И правильно, что не работает. У тебя ведь размер элемента массива - 2 байта, значит индекс нужно на 2 умножать:
mov si, 3
shl si, 1
mov ax, [si + offset mas]


Ответ отправлен: 12.05.2003, 20:22
Отправитель: Bob Johnson


Отвечает _vt

Добрый день, Lamer!
1)
Локальные переменные (переменные объявленные в функции) всегда размещаются в стеке и адресуются относительно SS:BP.
Значение локальной переменной - знаковое смещение относительно BP. (Почти дословный перевод из BC Help)
Переменная mas располагается в памяти так:
00 00 01 00 02 00 03 00 04 00 [bp]
[bp-02] - указывает на 5-й элемент,
[bp-04] - на 4-й элемент
[bp-0A] - на 1-й.
Поместить в AX третий элемент массива mas:
_asm mov ax,[bp-06]



Ответ отправлен: 13.05.2003, 23:17
Отправитель: _vt


 Вопрос № 3191

КИТАЙСКАЯ MANTRA ТОТЕМ УДАЧИ.
Вы можете не верить в это, но советы великолепны!
Прочитайте все нижеследующее и вы возможно научитесь чему-то!!!
ОДИН.
Давайте людям больше чем, они ожидают и делайте это легко.
ДВА.
Женитесь на мужчине/женщине, с которым Вы любите говорить.
Поскольку cо временем, старея, диалоговые навыки будут столь же
важны как любые другие.
ТРИ.
Не верьте всему, что Вы слышите, тратьте все, что Вы имеете
или промахнетесь мимо всего что хотите.
ЧЕТЫРЕ.
Когда говорите, " я люблю Вас ", имейте это в виду.
ПЯТЬ.
Когда говорите, " мне жаль ", смотрите человеку в глаза.
ШЕСТЬ.
Будьте помолвлены как минимум 6 месяцев прежде чем
поженится.
СЕМЬ.
Верьте в любовь с первого взгляда.
ВОСЕМЬ.
Никогда не смейтесь над чужими мечтами. Люди у которых нет
мечтаний,многое теряют.
ДЕВЯТЬ.
Любите глубоко и неистово. Вам может быть больно, но это
единственный способ жить в полную силу.
ДЕСЯТЬ.
В разногласиях, боритесь справедливо. Пожалуйста не
переходите на личности.
ОДИННАДЦАТЬ.
Не судите людей по их родственникам.
ДВЕНАДЦАТЬ.
Говорите медленно, но думайте быстро.
ТРИНАДЦАТЬ.
Когда кто-то спрашивает у Вас вопрос, на который Вы не
хотите отвечать, улыбнитесь и спросите, "Почему Вы хотите это
знать?"
ЧЕТЫРНАДЦАТЬ.
Помните, что большая любовь и большие достижения требуют
большого риска.
ПЯТНАДЦАТЬ.
Говорите "будьте здоровы" когда слышите, что кто-то чихает.
ШЕСТНАДЦАТЬ.
Когда Вы проиграли, не забудьте извлечь урок.
СЕМНАДЦАТЬ.
Помните три У:
Уважение к себе;
Уважение к другим;
Умение нести ответственность за все Ваши действия.
ВОСЕМНАДЦАТЬ.
Не позволяйте маленькому спору разрушить большую дружбу.
ДЕВЯТНАДЦАТЬ.
Когда Вы понимаете, что совершили ошибку, предпринимайте
немедленные шаги, чтобы исправить ее.
ДВАДЦАТЬ.
Улыбайтесь когда берете трубку.
Звонящий будет слышать это в вашем голосе.
ДВАДЦАТЬ ОДИН.
Проводите некоторое время в одиночестве.
Теперь, - ЗАБАВНАЯ часть! Этот mantra тотем был послан Вам
для удачи.Это письмо пока обошло мир 10 раз. К вам придет удача
на протяжении четырех дней после передачи этого mantra тотема.
Пошлите копии людям, которым по вашему мнению нужна удача, Не посылает
деньги, поскольку у судьбы нет цены.
Не храните это сообщение mantra тотем должен оставить ваши руки в течении
96
часов.
Вы получите очень приятный сюрприз.
Это истинно, даже если Вы - не суеверны.
Пошлите это, по крайней мере 5 людям и ваша жизнь улучшится.
0-4 людей: Ваша жизнь улучшится слегка.
5-9 людей: Ваша жизнь приблизится к вашей мечте.
9-14 людей: Вас ждет как минимум 5 сюрпризов на протяжении следующих 3-ех
недель.
15 и выше: Ваша жизнь кардинально улучшится!!



Вопрос отправлен: 12.05.2003, 17:16
Отправитель: Спам нового времени (123@123.com)

[Следующий вопрос >>] [Список вопросов]

Отвечает ASMодей

Здравствуйте, Спам нового времени!
Советы действительно хорошие, хотя и не к месту.

Ответ отправлен: 13.05.2003, 11:08
Отправитель: ASMодей


Отвечает Pin

Добрый день, Спам нового времени!
Объясните пожалуйста отношение сей посылки к ассемблеру - теме рассылки.

Ответ отправлен: 13.05.2003, 00:17
Отправитель: Pin


Отвечает Lynx

Господа эксперты - дожили... Теперь в рассылку спам начинает приходить. Свидетельствует ли это о её популярности??? :)))


Ответ отправлен: 12.05.2003, 19:40
Отправитель: Lynx


 Вопрос № 3193

Хаюшки!
Господа эксперты, очень нужна 1 вещь: серийник к драйве студио 2.6 (нигде не могу найти!Подскажите...).
Заранее спасибо!
ЗЫ если не знаете -переправьте в рассылку....



Вопрос отправлен: 12.05.2003, 17:43
Отправитель: Vint (vint@townnet.ru)

[Следующий вопрос >>] [Список вопросов]

Отвечает Bob Johnson

Приветствую Вас, Vint!
Попробуй astalavista.box.sk - поиск краков.


Ответ отправлен: 13.05.2003, 12:33
Отправитель: Bob Johnson


 Вопрос № 3194

Хай, эксперты!
Тут ответ проскальзывал, что отладчик Wdasm, хороший.
А чем он хорош?
И еще, можно ли Sice запустить под win95, на DX386 с 4mb?
Проблема в том, что сайс грузится, но на винду не хватает оперативы...можно ли что нибудь подмутить с сайсом, чтоб он оперативы поменьше ел?



Вопрос отправлен: 12.05.2003, 18:16
Отправитель: Maverick (Maverick@nightmail.ru)

[Следующий вопрос >>] [Список вопросов]

Отвечает Broken Sword

Доброе время суток, Maverick!
чтоб поменьше ел оперативы - из winice.dat поубирай экспорт и таблицы символов, а больше никак

Ответ отправлен: 13.05.2003, 00:07
Отправитель: Broken Sword


 Вопрос № 3195

Привет, Broken Sword!
Я хочу спросить по одному моменту в твоей рассылке:
Начало каталога страниц в оперативной памяти будет располагаться по адресу 1Мб (100000h).
Это значение произвольное или как-то определяется? Могу я его запихать в 2 Мб и т.д. ?



Вопрос отправлен: 13.05.2003, 06:23
Отправитель: ZirK

[Следующий вопрос >>] [Список вопросов]

Отвечает Broken Sword

Здравствуйте, ZirK!
да без проблем!
см. дальше по тексту:
mov EDI,100000h ; начало каталога страниц (1Мб)
можешь вместо 100000h подставить любое число от 0 (вообще то лучше использовать адреса свыше 1Мб чтоб потом можно было безболезненно вернуться в RM) до РАЗМЕР_ТВОЕЙ_ОПЕРАТИВЫ минус 4Кб и еще: желательно чтоб оно было кратно 4Кб.

Ответ отправлен: 13.05.2003, 11:59
Отправитель: Broken Sword


 Вопрос № 3196

Здравствуйте Эксперты!
У меня тут беда. Надо в Вузе лабы сдавать, а я не знаю как одну задачку решить. Надо определить в каком режиме работает процессор в реальном или защищенном. Не подскажите как получить этот чертов флаг VM? Я пробовал pushfd, но почему-то ничего не получилось. Что-то я наверно пропустил т.к. тут должно быть очень простое решение. Остальные задачи были сложнее и я их решил, а на этой застрял! Подскажите плиз!!!
P.S. Забыл, нельзя использовать никаких функций ДОС - как решать - х.з. - намекните хоть.
Спасибо.



Вопрос отправлен: 13.05.2003, 07:08
Отправитель: c0c0

[Следующий вопрос >>] [Список вопросов]

Отвечает Eugene

Приветствую Вас, c0c0!
А при чём здесь флаг VM? Нужно заострить внимание на флаге CR0. Там первый бит показывает, в защищённом мы режиме или нет.
mov eax, cr0
test eax, 1
jz NotProtected
Protected:

Ответ отправлен: 13.05.2003, 09:15
Отправитель: Eugene


Отвечает Broken Sword

Доброе время суток, c0c0!
при чем тут VM? Если тебе нада определить реал/протект то смотри нулевой бит CR0:
mov EAX,CR0
test EAX,1
jz protected
real:

Ответ отправлен: 13.05.2003, 11:59
Отправитель: Broken Sword


Отвечает Knignick

Добрый день, c0c0!
За режим отвечает младший бит регистра CR0, если 1 - защищенный:
mov EAX, CR0
bt EAX, 1
jc protected_mode


Ответ отправлен: 13.05.2003, 12:11
Отправитель: Knignick


Отвечает Ramzes

Доброе время суток, c0c0!
Во первых Защищенный режим никакого отношения к флагу VM не имеет. Чтобы узнать в защищенном ты режиме или нет, надо проверить бит PE (Protection Enabled) регистра CR0.

Ответ отправлен: 13.05.2003, 14:10
Отправитель: Ramzes


Отвечает Lynx

Здравствуйте, c0c0!
А зачем тебе флаг VM? Тебе надо узнать флаг pe (Protected Enable) из регистра cr0.
Делаешь так:
mov eax, cr0
and eax, 1
Если eax = 0, значит процессор не в защищённом режиме, если eax = 1, то процессор в защищённом режиме. И всё. Ну реализацию я оставляю на тебя. :)))


Ответ отправлен: 13.05.2003, 15:16
Отправитель: Lynx


Отвечает _vt

Добрый день, c0c0!
Команда pushfd копирует в стек содержимое EFLAGS кроме флагов VM(!) и RF. Для проверки на режим v86 достаточно проверить флаг PE регистра cr0


Приложение:

Ответ отправлен: 13.05.2003, 23:18
Отправитель: _vt


Отвечает DiGiT[old]

Приветствую Вас, c0c0!
SMSW AX
TEST AL, 1
JZ RM
мы в защищенном
RM:
мы в реальном

Ответ отправлен: 14.05.2003, 06:58
Отправитель: DiGiT[old]


 Вопрос № 3197

Здравствуйте, эксперты. Как работать с битами? Я создаю файловую оболочку DOS. Есть переменная, которая должна показывать, выделен ли файл. Всего 2000 файлов и для каждого из них нужен всего один бит:выделен, или нет. Подскажите, пожалуйста, как записывать и читать таким способом. Заранее благодарен.



Вопрос отправлен: 13.05.2003, 08:22
Отправитель: a1 (a111_666@mail.ru)

[Следующий вопрос >>] [Список вопросов]

Отвечает Ayl

Доброе время суток, a1!
Хм, переменная... Эта переменная у тебя будет занимать 2000/8=250 байт. Советуемые тут тебе команды bt, btc и т.п., конечно, хорошие, но они не умеют обрабатывать более двойного слова. Да и не слишком они тебе помогут.
Насколько я понимаю, тебе нужно всего несколько операций: установить/сбросить для соответсвующего файла в списке признак выделения, последовательно просканировать список файлов и для каждого определить, выделен он или нет, определить для файла с заданным номером его состояние.
Тут возможны 2 подхода - либо ты для каждого файла используешь дополнительный бит под это дело (например, один из неиспользуемых битов в байте атрибутов (7 или 6)). Плюс - постоянное положение бита, упрощается установка/сброс признака (у тебя по любому есть указатель на имя файла), для определенного файла определить его признак. Второй подход - выделяешь 250 байт для всего списка файлов и играешься с масками и сдвигами (см.Приложение)


Приложение:

Ответ отправлен: 13.05.2003, 13:31
Отправитель: Ayl


Отвечает Eugene

Добрый день, a1!
Читаешь весь байт, а затем проводишь операции с маской.
Допустим 5-й бит говорит выделено у нас или нет:
opt - та переменная, которая показывает, выделен или нет
mov ax, opt
test ax,10000b
jz NotSelected
Selected:

Ответ отправлен: 13.05.2003, 09:19
Отправитель: Eugene


Отвечает DiGiT[old]

Доброе время суток, a1!
Написание на ассемблере таких вещей, имхо, это испытание на прочность и неуваежение к труду программистов, которые писали до тебя.Я бы например никогда не взялся писать на асме что то подобное:(.
Но к делу. В общем используй union наверное будет гораздо проще, а так можешь сам делать кучу масок, либо делать их динамически(с помощью сдвигов), либо есть команда bts.
ЗЫ предложение используй концепцию виртуального списка, то есть отображай то что надо(а остальное подгружай по необходимости, работать будет точно приятно), так как представь ты заходишь с помощью своей облочки в папку windows и скока будешь ждать :)). Это все старая концепция не юзай ее. К тому же в однозадачной ОС(если ее мона назвать ОС :))

Ответ отправлен: 14.05.2003, 06:52
Отправитель: DiGiT[old]


Отвечает Tigran K. Kalaidjian

Приветствую Вас, a1!
Поищите в архиве рассылки. Это уже было...
Вкратце:
Test al, 00010000b; проверка нужного бита по маске
jz metka1 ;если ноль, то прыгаем на metka1
jmp metka2 ;в противном случае прыгаем на metka2

Ответ отправлен: 14.05.2003, 15:17
Отправитель: Tigran K. Kalaidjian


Отвечает Knignick

Добрый день, a1!
В твоем случае, имхо, удобно использовать функции bt, btc, btr, bts для работы с таким количеством битов.


Ответ отправлен: 13.05.2003, 12:33
Отправитель: Knignick


Отвечает akul

Доброе время суток, a1!
используй test, btr, bts для работы с битами в рамках байта и
shr al, 3
для поиска нужного байта в массиве


Ответ отправлен: 13.05.2003, 10:35
Отправитель: akul


Отвечает Lynx

Доброе время суток, a1!
Установку бита можно выполить командой or, а прочитать командой and:
or al,01000000b - значит установить 6-й бит.
and al, 0100000b - если al = 0, то бит = 0, если al = 1, то бит = 1.


Ответ отправлен: 13.05.2003, 15:16
Отправитель: Lynx


Отвечает Bob Johnson

Здравствуйте, a1!
Для проверки бита применяется команда test:
test ax, 40h, например.
для устновки бита - or
для сброса - and
Еще, конечно, есть bts, btr, btc и bt.


Ответ отправлен: 13.05.2003, 18:18
Отправитель: Bob Johnson



Форма отправки вопроса

Внимание!
Мы рекомендуем открывать рассылку в программе Internet Explorer 5.0+ или отправлять вопросы с сайта по адресу: http://rusfaq.ru/cgi-bin/Message.cgi.

(C) 2002-2003 Команда RusFAQ.ru.

 Персональные данные

Ваше имя:

Ваш e-mail:

Опубликовать мой e-mail в рассылке


 Вопрос и дополнение

Ваш вопрос:


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


Получить ответов:


 Выбор рассылки

Программисту
Assembler (40)
C / C++ (30)
Perl (4)
Builder / Delphi (16)
Pascal (31)
Basic / VBA (12)
Java / JavaScript (11)
PHP (5)
MySQL / MSSQL (4)
Пользователю
Windows 95/98/Me (42)
Windows NT/2000/XP (30)
"Железо" (29)
Поиск информации (14)
Администратору
Windows NT/2000/XP (19)
Linux / Unix (10)
Юристу
Гражданское право (7)
Семейное право (4)
Трудовое право (5)
КоАП (4)

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




Задать вопрос | Регистрация эксперта | Поиск в базе | Чат | Форумы | Новости
Проект экспертов RusFAQ.ru | Фотоальбом | Virus.RusFAQ.ru | Администрирование


Яндекс цитирования
© 2003 Россия, Москва. Авторское право: RusFAQ.ru


http://subscribe.ru/
E-mail: ask@subscribe.ru
Отписаться
Убрать рекламу

В избранное