Рассылка закрыта
При закрытии подписчики были переданы в рассылку "RFpro.ru: Ассемблер? Это просто! Учимся программировать" на которую и рекомендуем вам подписаться.
Вы можете найти рассылки сходной тематики в Каталоге рассылок.
RusFAQ.ru: программирование на языке Assembler
Информационный Канал Subscribe.Ru |
RusFAQ.ru: программирование на языке Assembler
Выпуск № 718
от 03.05.2004, 10:40
Администратор: Имя: Калашников О.А. URL: Информационный ресурс ICQ: 68951340 Россия, Москва |
О рассылке: Задано вопросов: 5217 Отправлено ответов: 14346 Активность: 274.9 %
|
Список экспертов, ответы которых опубликованы в данном выпуске |
Bob Johnson Статус: Профессиональный Общий рейтинг: 141.11 URL: Программирование [Подробней >>] |
Евгений Иванов Статус: Профессиональный Общий рейтинг: 133.33 URL: Super Assembler Software Телефон: НСС +7 831 3107039 [Подробней >>] |
Pawel Статус: Профессиональный Общий рейтинг: 156.56 [Подробней >>] |
Foamplast Статус: Профессиональный Общий рейтинг: 146.45 URL: мой личный сайт [Подробней >>] |
Acid Burn Статус: Доверительный Общий рейтинг: 134.83 [Подробней >>] |
Artemy Статус: Опытный Общий рейтинг: 112.45 Телефон: 8 905 549 38 66 [Подробней >>] |
VOVAN Статус: Опытный Общий рейтинг: 105.33 [Подробней >>] |
resu Статус: Начальный Общий рейтинг: 111.76 [Подробней >>] |
Ayl Статус: Профессиональный Общий рейтинг: 116.61 [Подробней >>] |
_vt Статус: Профессиональный Общий рейтинг: 117.95 [Подробней >>] |
Краткий перечень вопросов |
Вопрос № 5188. Приветствую Вас!!! Подскажите как можно перемножить два упакованных двоично-десятичных числа (они пр... (ответов: 1)
Вопрос № 5189. Уважаемые эксперты! Вопрос у меня сложный, но все же надеюсь, что кто-то поможет. Есть программа, ра... (ответов: 3)
Вопрос № 5190. Здравствуйте! Начал изучать ассемблер, есть вопросы. Приведу код примера (см. приложение): Я не знаю... (ответов: 7)
Вопрос № 5191. Здравствуйте уважаемые эксперты! Скачанная мной версия 4.2.7 отладчика SoftIce с (http://reversing... (ответов: 1)
Вопрос № 5193. Всем привет! Вопрос. Win98SE, DOS. Есть четыре отдельных байта в памяти: byte1, byte2, byte3, byte4,... (ответов: 2)
Вопрос № 5194. Уважаемые эксперты! Сколько максимум одновременно открытых хэндлов поиска файлов может держать Windo... (ответов: 3)
Вопрос № 5195. Приветствую! Расскажите о внутреннем представлении чисел типа single в pascal 7.0, т.е. что у них гд... (ответов: 1)
Вопрос № 5196. Вот я и вернулся... Как поживаем, кто еще остался? Калашников меня отрубил еще в декабре, хотя срок ... (ответов: 2)
Вопрос № 5197. Здравствуйте, уважаемые Эксперты! Вопрос такой: хочу читать данные с винта посекторно (все на win2k)... (ответов: 2)
Вопрос № 5198. расьти... я вот тут читал немножко и там было про функцию установки указателя в файле (под ДОС), ну ... (ответов: 5)
Вопросов: 10, ответов: 27
Вопрос № 5188 |
Приветствую Вас!!!
Подскажите как можно перемножить два упакованных двоично-десятичных числа (они представлены в виде массива из 3 байтов = 6 разрядов) без применения коррекции и не переводя их в двоичный вид.
P.S. и как разделить? Сложение сделал, а умножение и деление не могу (лаб. раб.).
Или ссылку в Инете.
Вопрос отправлен: 28.04.2004, 01:45
Отправитель: Стас (stas3@belnet.ru)
[Следующий вопрос >>] [Список вопросов]
Отвечает Bob Johnson
Добрый день, Стас!
Ты можешь сделать это по принципу умножения в столбик. но какую-то коррекцию все равно придется делать, т.к. умножение одноразрядных чисел дает двухразрядное число. Или создай себе таблицу умножения 10*10 в текстовом виде.
* EMan1.5: ---===*** The game we play ***===---
Ответ отправлен: 28.04.2004, 21:20
Отправитель: Bob Johnson
Вопрос № 5189 |
Уважаемые эксперты! Вопрос у меня сложный, но все же надеюсь, что кто-то поможет. Есть программа, разработанная на C++ Builder, а в ней ассемблерная функция. В этой программе мне надо разобраться, но сделать это не получается, т.к. я не понимаю смысла работы функции (знания асма у меня - институтские, на уровне "сложить два числа")! Разобраться самостоятельно не вышло. Из чего вытекают несколько вопросов:
1) ГДЕ в асм-коде используются параметры процедуры FVectRGB24to_ (pdst, psrc, iwidth)? Или они "по умолчанию" идут в какие-то регистры? В какие?
2) можно ли переписать код функции на С или (в идеале) Дельфи?
Приложение:
Вопрос отправлен: 28.04.2004, 08:42
Отправитель: L_Dorrit
[Следующий вопрос >>] [Список вопросов]
Отвечает Евгений Иванов
Доброе время суток, L_Dorrit!
Используется только один параметр: RGB_DATA
Это адрес.
Остальные не используются.
А рассчитывается что-то геометрическое с помощью математики.
Бывай!
* EMan: -=- Любовь существует! =-=
Ответ отправлен: 29.04.2004, 23:26
Отправитель: Евгений Иванов
Отвечает Pawel
Здравствуйте, L_Dorrit!
Так вот например запись параметра в ebx:
mov ebx,RGB_DATA;
"они "по умолчанию" идут в какие-то регистры" - такого там нет.
Возможно это делается через C.
Переписать без знания Asm нельзя.
Ответ отправлен: 29.04.2004, 11:45
Отправитель: Pawel
Отвечает Foamplast
Приветствую Вас, L_Dorrit!
- Здесь используется конвенция передачи параметров fastcall. Она состоит в том, что первый параметр помещается в Ecx, второй в Edx, а если есть другие, то они напихиваются в стек в обратном порядке. Стек очищает вызванная функция. Пример: функция принимает 5 параметров. В этом случае первый параметр идёт в Ecx, второй в Edx, затем в стек помещается параметр 5, затем 4, затем 3.
- Скорее всего, нет. Здесь используются команды MMX. Их прямых аналогов на высоком уровне нет. Может быть есть какие-то функции, использующие MMX. Да и зачем на С переписывать, вроде итак на С, только с асмовской начинкой.
Ответ отправлен: 01.05.2004, 01:59
Отправитель: Foamplast
Вопрос № 5190 |
Здравствуйте!
Начал изучать ассемблер, есть вопросы.
Приведу код примера (см. приложение):
Я не знаю что делают некоторые комманды.
Что такое CSEG segment & CSEG ends, что это за блок?
Тоже самое Start: & end Start.
И почему эти блоки так странно расположенны, перекрывая друг друга?
CSEG segment
Start:
...
CSEG end
end Start
Что такое org 100h? Что за прерывание?
Для чего в регистр ah загружается 9 ?
Что такое offset?
Что такое db в 3 строке?
И почему эта строка распологается после 5 строки и после
Дайте пожалуйста ссылку на сайт, где можно найти информацию об асм.
Спасибо огромное!
Приложение:
Вопрос отправлен: 28.04.2004, 13:57
Отправитель: M
[Следующий вопрос >>] [Список вопросов]
Отвечает Acid Burn
Добрый день, M!
Нет смысла обьяснять тебе этот пример здесь. Ты все равно моло что поймешь. Будет лучше, если ты начнешь свое изучение Ассемблера с хорошей книги, например Питера Абеля "Ассемблер язык программирования для IBM PC" или Зубкова "Ассемблер для Dos, Windows, Unix"
Ответ отправлен: 28.04.2004, 15:01
Отправитель: Acid Burn
Отвечает Artemy
Добрый день, M!
CSEG segment и CSEG ends
Это описания начала и конца сегиента кода
Start: это метка точки входа в программу (Entry Point), базовый адрес которой задается директивой org XXXXh в данном случае как для .com файлов = 100h.
end start определяет конец кода программы. Strat здесь указывает на точку входа. Обязательно должно быть в конце всего текста программы.
9 в регистре AH это код функции ДОС - печать строки.
offset означает смещение до метки или адрес метки относительно начала сегмента в котором она расположена.
директива db значит что после неё будет задана определенная последовательность байт (dw - слов, dd - двойных слов)
Ответ отправлен: 28.04.2004, 15:34
Отправитель: Artemy
Отвечает VOVAN
Доброе время суток, M!
org 100h - начинать со смещения 100
mov ah,9 - загрузить в регистр ah число 9(номер ф-ии прерывания)
mov dx, offset mStr - загружает в соответствующий регистр адрес строки
int 21h - вызываем прерывание, которое печетает строк на экран(9-ая ф-ия).
mov ah,10h
int 16h --- 10-ая ф-ия прерывания int 16h, которая ждёт нажатия клавиши.
int 20h - прерывание, которое завершает прогу.
mStr db 'Press any key...' - mStr - метка на строку, адрес которой позже передаётся на обаботку прерыванию.
Ответ отправлен: 28.04.2004, 16:35
Отправитель: VOVAN
Отвечает Евгений Иванов
segment - это директива Ассемблера по обозначению сегмента.
Start: - это метка. Простая метка. Адрес.
end - директива по обозначению окончания Ассемблерной программы в этом файле. После этой директивы можно писать любые строчки, они не обрабатываются.
И после "END" пишешь адрес (метку), с которой программа стартует.
Это для EXE-программ нужно, а для COM-программ программа всегда стартует с адреса 256, поэтому и необходимо писать ORG 256.
Прерывания используются 33 - dos-прерывание.
22 - клавиатурное.
И 32 - окончание программы.
Это код CD "номер".
Выполняется переход на подпрограмму через таблицу прерываний.
Прерывания в ДОС и BIOS служат как рабочие функции для выполнения разных действий.
AH = 9, это номер функции.
offset - это смещение в текущем сегменте. По сути, адрес.
DB - определяем байты. Можно писать как байты, так и строки.
Удачи!
* EMan: -=- Любовь существует! =-=
Ответ отправлен: 29.04.2004, 23:26
Отправитель: Евгений Иванов
Отвечает Pawel
Приветствую Вас, M!
Это вызов функций доса(int 21)
mov ah,номер функции
int номер прерывания.
org 100h это адрес начала проги в памяти.
CSEG segment & CSEG ends - сегмент программы
Start: & end Start - начало и конец програмы
offset - это значит, что в регистр загружаются не данные ,а их адрес.
Ответ отправлен: 29.04.2004, 11:50
Отправитель: Pawel
Отвечает resu
Здравствуйте, M!
Ответ отправлен: 29.04.2004, 19:27
Отправитель: resu
Отвечает Foamplast
Приветствую Вас, M!
Многие непонятные Вам слова являются не командами, а директивами. Они не ассемблируются в файл. Они просто сообщают ассемблеру разного рода информацию.
CSEG - Это директива, определяющая сегмент кода. Всё, что находится внутри будет ассемблироваться в раздел кода. В исполняемых файлах под современные ОС обычно содержатся разделы кода, данных и неинициализированных данных. При наличии соответствующего железа (процессора) раздел кода загружается так, что из него можно читать и исполнять команды, но не писать туда. А разделы данных можно читать и писать в них, но не исполнять (хотя у меня под Win2000 как-то раз и исполнялись команды из раздела данных, это всё равно следует считать исключением или ошибкой разработчиков).
Start: - это метка, которая будет указана в исполнимом файле в качестве входной. То есть программа будет выполняться с команды, следующей непосредственно за меткой Start: Это все равно, что сказать ассмеблеру: "Программа должна начать выполняться с этого места". Метки - простой способ пометить какое-либо место в файле (в разделе кода или данных). Процессор ведь читает данные, находящиеся по какому-либо адресу. Ассемблер как раз и преобразует символьные метки в адреса.
end Start - это директива, указывающая ассемблеру, что программа закончилась, а также с какого места начать выполнять программу. Обычно точку входа называют Start:, поэтому программа должна заканчиваться словами end Start. Возможно, что метка начала может называться по-другому, но если всегда называть точку входа Start, то почти все ассемблеры это поймут одинаково.
Как уже объяснялось в предыдущих пунктах CSEG - это раздел, Start: - метка, а end Start - директива. Метка должна входить в какой-нибудь раздел, а директива - нет. Ну то есть Start: и end Start - не блок, хоть по смыслу и используются вместе.
org 100h - не прерывание. Это директива, указывающая ассемблеру, что ко всем адресам после этой директивы надо прибавлять 100h (в десятичной это 256). Дело в том, что операционная система ДОС загружает COM-файлы в один сегмент памяти с адреса 256 (100h). А первые 256 байт сегмента использует для своих нужд. Получается, что если не указывать org 100h, то адрес метки Start: будет равен 0, потому что перед Start нету никаких команд или данных. Но ДОС-то загрузит программу не с начала сегмента, а начиная с 257-го байта. Таким образом адрес метки Start: будет 256. Для того, чтобы адреса были правильными и пишут org 100h.
Рис. 1
0
211
353
code
data
bss
в файле
0
256
467
564
system
code
data
bss
в памяти
Как видно из рис. 1, адрес первой ячейки данных в файле равен 211. Но при загрузке весь файл располагается с адреса 256, поэтому адрес первой ячейки данных в памяти равен 467. То есть все адреса должны быть сдвинуты на 256 (100h). Поэтому при ассемблировании в COM-файл и пишут вначале org 100h. При ассемблировании в другие форматы org 100h писать не надо.В регистр ah загружается 9, потому что 9 - номер функции ДОС, выводящей строку на экран. Перед вызовом функций ДОС в ah помещают номер функции, а затем производят прерывание int 21h. Конкретно для функции номер 9 в регистр dx необходимо поместить адрес строки, которую надо вывести. Строка выводится до первого символа $ (то есть в тексте программы скорее всего ошибка).
Offset - это смещение метки относительно начала сегмента. То есть offset mStr - смещение (адрес) метки mStr Относительно начала сегмента CSEG.
Db - Директива, записывающая заданную последовательность байт в файл. Это может быть, например, строка символов, которую необходимо вывести на экран.
Есть хороший сайт wasm.ru, но он в основном для подготовленных людей, хотя были статьи и для новичков.
Найдите себе книгу, в которой всё описано с нуля. Я пять лет назад читал книгу Зубкова С.В. "Assembler для DOS, Windows и UNIX". Есть и другие книги такого типа. Причём лучше всего купить бумажную книгу. Это пригодится при работе в DOS (чем Вы по всей видимости и занимаетесь).
Ответ отправлен: 02.05.2004, 03:06
Отправитель: Foamplast
Вопрос № 5191 |
Здравствуйте уважаемые эксперты!
Скачанная мной версия 4.2.7 отладчика SoftIce с (http://reversing.kulichki.com) вместе с Loader SoftIce (wmldr05.rar, который решает проблему загрузки на WinMe) не хочет запускаться на WinMe - (Мат. плата Acorp, Celeron 460, оперативки 64Мб, видео S3 Trio 3D/2X) при запуске динамик пищит несколько раз и SoftIce выдает сообщение "Windows not found", а переставлять на Win98 нельзя. На WinXPPro (без SP1, комп. P4) SoftIce работает нормально сразу после инсталляци, но после перезагрузки и запуска SoftIce, например в режиме Manual, при нажатии Ctrl+D система виснет, а окна отладчика не видно, но он работает так как если нажать 'X' и 'Enter', то система выходит из подвешенного состояния. Пожалуйста, помогите решить эти проблемы!
С уважением, fwd.
Вопрос отправлен: 28.04.2004, 15:08
Отправитель: fwd
[Следующий вопрос >>] [Список вопросов]
Отвечает Foamplast
Здравствуйте, fwd!
Предлагаю открыть новую категорию вопросов "установка и использование отладчика SoftIce" :)
Fwd, если Вы не пишете драйвер и не ломаете винду, пользуйтесь OllyDbg - это намного проще. http://home.t-online.de/home/Ollydbg
Ответ отправлен: 02.05.2004, 03:06
Отправитель: Foamplast
Вопрос № 5193 |
Всем привет!
Вопрос. Win98SE, DOS. Есть четыре отдельных байта в памяти: byte1, byte2, byte3, byte4, которые являются частями одного 32-х разрядного числа. Каким образом в Assembler можно вывести это число в десятичном виде в ASCII-коде в текстовый файл?
Пример. Есть число FA1DE5C8h, соответственно, в byte1-FAh, в byte2-1Dh, в byte3-E5h, в byte4-С8h. В текстовый файл необходимо вывести это число в десятичном виде в ASCII-кодах, то есть - 4196263368.
С 16-ти разрядными числами проблем нет, а вот как это делать с числами разрядностью более 16-ти?
Спасибо.
Александр
Вопрос отправлен: 28.04.2004, 23:23
Отправитель: aplet (aplet_ai@mail.ru)
[Следующий вопрос >>] [Список вопросов]
Отвечает Ayl
Здравствуйте, aplet!
Тоже без проблем. Если ты расположишь их в памяти вот так:
byte4 db ?
byte3 db ?
byte2 db ?
byte1 db ?
то сможешь одной командой загрузить его в 32-х разрядный регистр:
mov eax, dword ptr [byte4]
А дальше все просто - делишь на 10 и формируешь строку.
Только делить нужно в 64-разрядном виде:
mov ebx, 10
lea si, OutStrEnd - 1
@@loop:
xor edx, edx
div ebx
; в eax - частное, в edx - остаток
mov [si], dl ; остаток < 10!
dec si ; остатки записываем в обратном порядке
or eax, eax
jnz @@loop
mov ah, 9
lea dx, OutStr
int 21h
...
OutStr db 10 dup (' '), '$'
OutStrEnd EQU $
Ответ отправлен: 29.04.2004, 14:19
Отправитель: Ayl
Отвечает Foamplast
Приветствую Вас, aplet!
А скольки разрядная у Вас машина? Если 32-х, то это проще пареной репы. Загружаете байты в нужном порядке в регистр (Eax для i8086-совместимых машин) и делите его на 10 до посинения. При этом на каждом шаге будут получаться остатки от 0 до 9. К каждому прибавляете код символа 0 и выводите в буфер. После очередного деления берёте частное за делимое и повторяете процесс. Как только частное станет равно 0, процесс завершается. Останется только вывести символы из буфера на экран в обратном порядке.
Ответ отправлен: 02.05.2004, 03:05
Отправитель: Foamplast
Вопрос № 5194 |
Уважаемые эксперты! Сколько максимум одновременно открытых хэндлов поиска файлов может держать Windows?
Вопрос отправлен: 29.04.2004, 00:48
Отправитель: Alex
[Следующий вопрос >>] [Список вопросов]
Отвечает Pawel
Доброе время суток, Alex!
По идее - много. А в чём заключается проблема?
Я работал поралельно с 10-ю хендлами.
Ответ отправлен: 29.04.2004, 11:55
Отправитель: Pawel
Отвечает _vt
Здравствуйте, Alex!
Win 95 и старше - неограниченно.
E-Man : Life begins at 1000Mhz!
Ответ отправлен: 30.04.2004, 05:21
Отправитель: _vt
Отвечает Foamplast
Доброе время суток, Alex!
Смотря какая Windows. Все NT (NT 3.51, NT 4.0, Win2000, XP, Server 2003) - дофига. А вот 95/98 что-то вроде 16384, причём возможно, что это в совокупности, то есть и хэндлы поиска и открытых файлов. Но проблема в том, что сейчас я не смог найти эти цифры, хотя где-то видел. Вообще можно предположить, что количество хэндлов ограничено разрядностью машины. Отсюда и цифры 16384 для домашних Windows, в которых полно 16-разрядного кода. А вот в нормальных виндах должно быть около 4 294 967 296. При этом некоторые биты и некоторые значения могут использоваться в специальных целях.
Ответ отправлен: 02.05.2004, 03:05
Отправитель: Foamplast
Вопрос № 5195 |
Приветствую! Расскажите о внутреннем представлении чисел типа single в pascal 7.0, т.е. что у них где в их двоичном виде?
Вопрос отправлен: 29.04.2004, 00:48
Отправитель: Стас (stas3@belnet.ru)
[Следующий вопрос >>] [Список вопросов]
Отвечает Artemy
Здравствуйте, Стас!
Насколько я понял single это что-то типа числа с плавающей точкой одинарнйой точности (4 байта), если да, то так:
Компьютерное представление вещественных
чисел.
Вещественные числа представляются в ПК в форме с плавающей точкой.
Этот формат использует представление вещественного числа R
в виде произведения мантиссы m на основание системы счисления p в некоторой
целой степени n которую называют порядком: R=m*pn
Представление
числа в форме с плавающей точкой неоднозначно.
color=red>Например:
25.324=25324*101=0.0025324*104=2532.4*10-2
В ЭВМ используют нормализованное представление числа в
форме с плавывающей точкой. Мантисса в нормализованном представлении
должна
удовлетворять условию: 0.1psrc="Представление числовой информации.files/A_19.gif"
border=0>m<1p
Иначе говоря, мантисса меньше 1 и первая значащая
цифра - не 0.
В памяти компьютера мантисса представляется как целое число,
содержащее только значащие цифры (0 целых и запятая не храняться).
Следовательно, внутреннее представление вещественного числа сводиться к
представлению пары целых чисел: мантиссы и порядка.
Например: 4-x байтовая ячейка памяти. В
ячейке должна содержаться следующая информация о числе:
- знак числа;
-
порядок;
- значащие цифры мантиссы.
src="Представление числовой информации.files/A_14.gif" border=0> | МАН | ТИ | ССА |
1-й байт | 2-й байт | 3-й байт | 4-й байт |
В старшем бите 1-го байта храняться знак числа: 0 обозначает
плюс, 1 - минус.
Оставшиеся 7 бит 1-го байта содержат машинный порядок. В
следующих трех байтах храняться значащие цифры мантиссы (24 разряда).
В семи двоичных разрядах помещаются двоичные числа в диапозоне
от 0000000 до 1111111. Значит, машинный порядок изменяется в диапозоне от 0 до
127 (в десятичной системе счисления). Всего 128 значений. Порядок, очевидно,
может быть как положительным так и отрицательным. Разумно
эти 128 значений
разделить поровну между положительным и отрицательным значениеями порядка: от
-64 до 63.
Машинный порядок смещен относительно математическиго и имеет
только положительные значения. Смещение выбирается так, чтобы минимальному
математическому значению порядка соответствовал нуль.
Связь между машинным порядком (Мр) и математическим (р) в
рассматриваемом случае выражается формулой:
Полученная формула записана в десятичной системе. В двоичной
системе формула имеет вид: Mp2=p2+10000002
Для записи внутреннего представления вещественного числа необходимо:
1)
перевести модуль данного числа в двоичную систему счисления с 24 значащими
цифрами;
2) нормализовать двоичное число;
3) найти машинный порядок
в
двоичной системе счисления;
4) учитывая знак числа, выписать его
представление в 4-х байтовом машинном слове.
Ответ отправлен: 30.04.2004, 09:50
Отправитель: Artemy
Вопрос № 5196 |
Вот я и вернулся... Как поживаем, кто еще остался?
Калашников меня отрубил еще в декабре, хотя срок к тому моменту еще не истёк. На письма он не реагирует - вот хочу обратиться к экспертам - что с ним делать? Не хочется начинать всё заново, тем более, что все данные о себе у меня сохранены.
С уважением
Тигран Калайджян
2:5020/2987.25
Вопрос отправлен: 29.04.2004, 09:00
Отправитель: Tigran K. Kalaidjian
[Следующий вопрос >>] [Список вопросов]
Отвечает Евгений Иванов
ВЕРНУТЬ ТИГРАНА!!!!!!!!!!
* EMan: -=- Любовь существует! =-=
Ответ отправлен: 29.04.2004, 23:26
Отправитель: Евгений Иванов
Отвечает _vt
Доброе время суток, Tigran K. Kalaidjian!
> Как поживаем, кто еще остался?
Ага, помним! ;) Есть еще живые... :)
> что с ним делать?
Gibbel тебе поможет... ;-))
С уважением,
2:5009/5.20 :-)
E-Man : Life begins at 1000Mhz!
Ответ отправлен: 30.04.2004, 05:21
Отправитель: _vt
Вопрос № 5197 |
Здравствуйте, уважаемые Эксперты!
Вопрос такой: хочу читать данные с винта посекторно (все на win2k), для чего с помощью CreateFile открываю логический диск. В этом проблем нет. Проблема в том, что каогда пытаюсь читать его с помощью ReadFile вызов заканчивается ошибкой. Но ошибка происходит не всегда, а только в том случае если буфер находится в сегменте данных (на границу 512 он выровнен), а если буфер выделен с помощью VirtualAlloc, то все нормально. В чем может быть дело?
Вопрос отправлен: 29.04.2004, 09:15
Отправитель: Леонид
[Следующий вопрос >>] [Список вопросов]
Отвечает Pawel
Приветствую Вас, Леонид!
Это может быть связанно с "защитой" win2k частично блокирующей работу с винтом. Попробуйте на другой ОС, или увеличить буфер в секции данных.
Ответ отправлен: 29.04.2004, 20:00
Отправитель: Pawel
Отвечает Foamplast
Приветствую Вас, Леонид!
В описании ReadFile сказано, что VirtualAlloc() выделяет блоки, выровненные по страницам. Может в это всё дело?
Ответ отправлен: 02.05.2004, 03:05
Отправитель: Foamplast
Вопрос № 5198 |
расьти...
я вот тут читал немножко и там было про функцию установки указателя в файле (под ДОС), ну и написано что мол с помощью этой ф-и можно размер файла определять, и как я понял алгоритм такой: сначало устанавливаем указатель на конец файла, потом на начало, потом из конца вычитаем начало и получаем размер файла. я правильно понял? (1)
и еще, дапустим мне надо считать файл по частям например по 1Kb, то есть мы получаем размер файла и по 1Kb читаем, а че делать когда в конце окажеться <1Kb (2), получается он с диска еще считает инфирмации после нашего файла???
p.s.
а что значит галочка "опубликовать мой мыл в рассылке"? в какой рассылке?
Вопрос отправлен: 29.04.2004, 10:31
Отправитель: очень хочу научиться
[Следующий вопрос >>] [Список вопросов]
Отвечает Acid Burn
Здравствуйте, очень хочу научиться!
Нет! Вы верно не опняли алгоритм! Устанавливаем указатель на конец файла, а функция заносит его размер в DX:AX.
при считывании информации из файла если буффер имеет больший размер,чем считываемая область, то функция чтения прочтет файл до конца, занесет в регистр AX кол-во почтенных байтов, а в буффере после считанной области значения останутся не изменными.
Ответ отправлен: 01.05.2004, 22:03
Отправитель: Acid Burn
Отвечает Евгений Иванов
Доброе время суток, очень хочу научиться!
Не считает :)
Он считает сколько осталось, и вернёт код ошибки. И ещё вернёт, сколько он считал.
* EMan: -=- Любовь существует! =-=
Ответ отправлен: 29.04.2004, 23:26
Отправитель: Евгений Иванов
Отвечает Pawel
Здравствуйте, очень хочу научиться!
1)Да правельно.
2) Выполнять проверку. если используете (int 21h) то получите ошибку.
3)В рассылке "RusFAQ.ru: программирование на языке Assembler"
Ответ отправлен: 29.04.2004, 12:02
Отправитель: Pawel
Отвечает Ayl
Добрый день, очень хочу научиться!
1. Неправильно. Потому что начало файла всегда 0. Поэтому нужно только установить указатель на конец файла:
AH = 42h
BX = file handle
CX:DX = 0
AL = 2 (отсчет с конца файла)
После выполнения функции на выходе в геристрах DX:AX будет новая позиция, если флаг CF будет сброшен.
2. Нет, он считает ровно столько, сколько есть в файле. Ты же не посекторно файл читаешь, а побайтно из файла! Заметь отличие этих двух фраз!
Файл ограничен своим размером, т.ч. считать больше того, что он физически занимает нельзя с помощью файловых функций. Просто при последнем чтении тебе будет возвращено реальное число прочитанных байт в регистре AX.
Ответ отправлен: 29.04.2004, 14:37
Отправитель: Ayl
Отвечает Foamplast
Здравствуйте, очень хочу научиться!
В общем, правильно. При этом функция 42h возвращает в CX:DX новое значение указателя от начала файла. То есть по Вашему алгоритму Вы вызовете функцию с CX=0 DX=0 AL=2, получите в CX:DX позицию от начала файла (т.е. длину), установите тем же способом (AL=0) указатель на начало, получите CX=0 DX=0, вычтете из предыдущего значения 0 и всё ништяк. Достаточно ясно, что можно сделать только один первый вызов.
А ничего не делать. Отдыхать. Если, например в файле 4125 байт, то на пятом чтении в буфер реально запишутся только 29 байт и, соответсвенно, в AX будет 29. А если в файле всего 500 байт, а читаем по 1 Кб, то в AX будет 500, а оставшиеся 524 байта будут нетронуты, то есть будут содержать мусор, который был там при выделении буфера. В общем, проверять нужно, сколько считалось.
Ответ отправлен: 02.05.2004, 03:05
Отправитель: Foamplast
Форма отправки вопроса |
Мы рекомендуем открывать рассылку в программе Internet Explorer 5.0+ или отправлять вопросы с сайта по адресу: http://rusfaq.ru/cgi-bin/Message.cgi.
(C) 2002-2003 Команда RusFAQ.ru.
Вопрос и дополнение |
Ваш вопрос:
Приложение (если необходимо):
Получить ответов:
Выбор рассылки |
Программисту Assembler (24) C / C++ (16) Perl (3) Builder / Delphi (20) Pascal (18) Basic / VBA (4) Java / JavaScript (5) PHP (12) Криптография (9) WinAPI (11) Радиоэлектроника (7) |
Пользователю Windows 95/98/Me (32) Windows NT/2000/XP (48) "Железо" (27) Поиск информации (13) |
Администратору Windows NT/2000/XP (27) Linux / Unix (9) |
Юристу Гражданское право (11) Семейное право (8) Трудовое право (10) КоАП (7) |
Отправить вопрос всем экспертам выбранной рассылки.
Проект экспертов RusFAQ.ru | Фотоальбом | Virus.RusFAQ.ru | Администрирование
Профессиональная WEB-Студия B.I.T.
http://subscribe.ru/
E-mail: ask@subscribe.ru |
Отписаться
Убрать рекламу |
В избранное | ||