Как я могу найти физический адрес файла? - PullRequest
1 голос
/ 19 июня 2011

Я использую GoAsm на Windows 7 - 64-битной ОС, и я буду задавать вам несколько (не так глупых) вопросов.

Первый вопрос:

Как мне найти физический адрес файла ? Предположим, файл «Text.txt» находится в корне моего раздела C: \. Есть ли способ получить точный адрес памяти, где находится этот файл?

Второй вопрос:

Можно ли вызвать подпрограмму, которая будет просто так делать, если я вызову функцию C?

(т.е.: рассмотрим функцию C «WriteToScreen», возможно ли иметь ту же функцию, но в формате ассемблера, что означает отсутствие необходимости использовать высокоуровневые вызовы для этой работы?

Третий вопрос:

Есть ли где-нибудь в сети файлы для GoAsm, содержащие полезные процедуры, такие как (перемещение, копирование, редактирование, стирание) команды? Сначала я подумал о прерываниях ms-dos, но мне не удается заставить их работать без сбоя программы. Я предполагаю, что это просто не совместимо с ОС Windows, хотя командная строка работает как ms-dos ...?

Четвертый вопрос:

Я слышал из разных источников и от себя, что NASM довольно плохо работает на Win7 x64 , это просто правда, или я делаю это неправильно?

Ответы [ 2 ]

0 голосов
/ 06 сентября 2015

Для первого вопроса просто перетащите файл в адресную строку в браузере

0 голосов
/ 02 июля 2011

1 Жесткий диск, с логической точки зрения, можно рассматривать как последовательность «блоков» (более распространенное название - сектора). Как физически организованы эти блоки на дисках, можно не принимать во внимание, но драйвер, конечно, должен каким-то образом знать, как получить данные, хотя вы отправляете современному драйверу hd «высокоуровневые» команды, которые, насколько вы знаете, не сильно связаны где физически находятся данные (вы можете сказать «прочитайте блок 123», но нет никаких внешних доказательств того, где этот блок живет).

Однако, таким образом, вы можете «назвать» блок номером и сказать, например, этот блок 0 является MBR. Каждый блок содержит несколько байтов (512, 1024 ...). Не все используемые блоки содержат фактические данные файла, на самом деле существуют метаинформации любого рода, в зависимости от файловой системы, но даже связанные со «структурой» жесткого диска (я имею в виду, разделы).

Файл, расположенный на жестком диске, автоматически не загружается в память, поэтому у него нет адреса памяти. Как только вы прочитаете его, его часть, если не все, конечно же, будет скопирована в предоставленную вами память, что не является внутренним свойством файла. (Файловые системы извлекают блоки, принадлежащие файлу, и «показывают» их, как мы привыкли их видеть, как единый «блок» файла)

Подводя итог: файлы не имеют адреса памяти. Физический адрес может быть набором блоков, содержащих данные (и метаданные, такие как inode ) файла, или просто первый блок (но если блок данных равен N, N + 1 не может принадлежать один и тот же файл - блоки не обязательно должны быть рядом друг с другом). Чтобы узнать их, вы должны проанализировать структуру файловой системы, которую вы используете. Я не знаю, есть ли API для их простого извлечения, но в худшем случае вы можете проанализировать исходный код файловой системы ... удачи!

2 С функции переведены в сборку. Если вы уважаете соглашение о вызовах C, вы можете написать «функцию C» непосредственно в сборке. Попробуйте прочитать это и это для x86.

3 Вы можете вызвать Windows API из ASM. Забудьте о MS-DOS, MS-DOS мертва, MS-DOS - это не Windows, cmd - это своего рода «эмуляция» ... на самом деле нет, не эмуляция, а просто интерфейс командной строки, напоминающий пользователей MS-DOS был использован для. Но это не совсем то же самое, то есть нет системного прерывания MS-DOS, которое вы можете использовать. Учебные пособия по сборке Ичелиона , хотя и старые, могут быть интересным ресурсом. (Если срок действия ссылки истекает, попробуйте использовать обратный автомат )

4 У меня нет Win7 и я никогда не устанавливал nasm на Windows, поэтому я не могу ничего сказать о.

...