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

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!

  1. Здесь используется конвенция передачи параметров fastcall. Она состоит в том, что первый параметр помещается в Ecx, второй в Edx, а если есть другие, то они напихиваются в стек в обратном порядке. Стек очищает вызванная функция. Пример: функция принимает 5 параметров. В этом случае первый параметр идёт в Ecx, второй в Edx, затем в стек помещается параметр 5, затем 4, затем 3.
  2. Скорее всего, нет. Здесь используются команды 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!

  1. Многие непонятные Вам слова являются не командами, а директивами. Они не ассемблируются в файл. Они просто сообщают ассемблеру разного рода информацию.


  2. CSEG - Это директива, определяющая сегмент кода. Всё, что находится внутри будет ассемблироваться в раздел кода. В исполняемых файлах под современные ОС обычно содержатся разделы кода, данных и неинициализированных данных. При наличии соответствующего железа (процессора) раздел кода загружается так, что из него можно читать и исполнять команды, но не писать туда. А разделы данных можно читать и писать в них, но не исполнять (хотя у меня под Win2000 как-то раз и исполнялись команды из раздела данных, это всё равно следует считать исключением или ошибкой разработчиков).


  3. Start: - это метка, которая будет указана в исполнимом файле в качестве входной. То есть программа будет выполняться с команды, следующей непосредственно за меткой Start: Это все равно, что сказать ассмеблеру: "Программа должна начать выполняться с этого места". Метки - простой способ пометить какое-либо место в файле (в разделе кода или данных). Процессор ведь читает данные, находящиеся по какому-либо адресу. Ассемблер как раз и преобразует символьные метки в адреса.


  4. end Start - это директива, указывающая ассемблеру, что программа закончилась, а также с какого места начать выполнять программу. Обычно точку входа называют Start:, поэтому программа должна заканчиваться словами end Start. Возможно, что метка начала может называться по-другому, но если всегда называть точку входа Start, то почти все ассемблеры это поймут одинаково.


  5. Как уже объяснялось в предыдущих пунктах CSEG - это раздел, Start: - метка, а end Start - директива. Метка должна входить в какой-нибудь раздел, а директива - нет. Ну то есть Start: и end Start - не блок, хоть по смыслу и используются вместе.


  6. 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 писать не надо.


  7. В регистр ah загружается 9, потому что 9 - номер функции ДОС, выводящей строку на экран. Перед вызовом функций ДОС в ah помещают номер функции, а затем производят прерывание int 21h. Конкретно для функции номер 9 в регистр dx необходимо поместить адрес строки, которую надо вывести. Строка выводится до первого символа $ (то есть в тексте программы скорее всего ошибка).


  8. Offset - это смещение метки относительно начала сегмента. То есть offset mStr - смещение (адрес) метки mStr Относительно начала сегмента CSEG.


  9. Db - Директива, записывающая заданную последовательность байт в файл. Это может быть, например, строка символов, которую необходимо вывести на экран.


  10. Есть хороший сайт wasm.ru, но он в основном для подготовленных людей, хотя были статьи и для новичков.


  11. Найдите себе книгу, в которой всё описано с нуля. Я пять лет назад читал книгу Зубкова С.В. "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.


Машинный порядок смещен относительно математическиго и имеет
только положительные значения. Смещение выбирается так, чтобы минимальному
математическому значению порядка соответствовал нуль.


Связь между машинным порядком (Мр) и математическим (р) в
рассматриваемом случае выражается формулой:


Мр = р + 64

Полученная формула записана в десятичной системе. В двоичной
системе формула имеет вид: 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.

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

Ваше имя:

Ваш e-mail:

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


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

Ваш вопрос:


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


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


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

Программисту
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.


Яндекс цитирования
© 2001-2004 Россия, Москва. Авторское право: Калашников О.А.


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


В избранное