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

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


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

РАССЫЛКИ ПОРТАЛА RUSFAQ.RU

/ КОМПЬЮТЕРЫ И ПО / Языки программирования / Assembler

Выпуск № 185
от 14.07.2005, 15:20

Администратор:Калашников О.А.
В номере:Вопросов: 6, Ответов: 13
В рассылке:Подписчиков: 244, Экспертов: 12


Вопрос № 23174: товарищи! помогите!! вопрос не совсем по ассемблеру, но чуствую, что вы мне поможете, вопрос связан с представлением чисел в памяти, и с так называемым выравниванием... это упражнение из книги, вот оно: " какие ограничения н...
Вопрос № 23189: Respect, ***[KoderS]*** :D I M ***[LvT]*** Я недавно начал изучать асм по WIN2, и у меня возникло несколько вопросов: Во-первых, как писать драйверы под Win2k/XP, где скачать русскую версию DDK и SDK, информацию про ToolHelp32...
Вопрос № 23238: Я с вашей помощью написал программу для чтения содержимого файла. Мне нужно следующее: Сделать такой цикл, чтобы программа завершилась при отображении последнего символа файла. Мне приходит в голову одна идея, заджампить цикл выво...
Вопрос № 23240: Вопрос по уроку 13 Калашникова про вирус Меня полностью сбила с толку следущая команда jmp dword ptr cs:[off_move] Согласно синтаксису (jmp адрес_перехода) вместо cs должен стоять es! Ведь cs указывает на текущий сегмент, а off_move е...
Вопрос № 23247: Вроде бы вопрос уже задовал, даже если задовал, то ответ просмотрел. Какой делитель кроме нуля вызывает ошибку переполнения? И еще мне никто не ответил цитата: ошибка при копировании "Неправильная функция MS-DOS" Такой messa...
Вопрос № 23268: Обьясните мне пожплуйста, если можно подробнее. Желательно очень подробно, назначение следующих команд: JC - NOP - И для чнго они применяются особенно NOP. NOP - вероятнее всего переводится как (No operation)....

Вопрос № 23.174
товарищи! помогите!!
вопрос не совсем по ассемблеру, но чуствую, что вы мне поможете, вопрос связан с представлением чисел в памяти, и с так называемым выравниванием...

это упражнение из книги, вот оно:
"
какие ограничения на типы указателей char*, int*, void* существуют в вашей системе? например, может ли int* иметь нечетное значение (подсказка: подумайте о выравнивании)?
"

собственно меня озадачило последнее предложение... что вы об этом думаете?
Отправлен: 07.07.2005, 15:47
Вопрос задал: yatagan (статус: 2-ой класс)
Всего ответов отправлено: 4

Отвечает: Евгений Иванов
Здравствуйте, yatagan!
есть выравнивание на байт, на слово (2 байта), на двойное слово и т.д.
поэтому оно может иметь нечётное значение, но это неэффективно по отношению к процессору. лучше вообще выравнивать на 4 байт - намного быстрее идёт доступ к памяти.

Удачи!
---------
Что имеем - не храним, потерявши - плачем
Ответ отправил: Евгений Иванов (статус: Профессор)
Отправлен: 07.07.2005, 16:15
Оценка за ответ: 5

Отвечает: John Freeman
Здравствуйте, yatagan!
В общем всё так и есть - выравнивание компилятором, а 32 bit Integer имеет размер 4 байта, чаще всего по нему и выравнивают=>нечётного быть не может, но , скажем, для Z80 это не имеет смысла :)
---------
You're trying to take me They trying to make me This is the only Gives me the only thing Tired of lying, I'm tired of lying The only thing I inderstand is what I feel...
Ответ отправил: John Freeman (статус: Профессор)
Отправлен: 07.07.2005, 16:19
Оценка за ответ: 5
Комментарий оценки:
спасибо, уже догнал...

Отвечает: Ayl
Здравствуйте, yatagan!

Хех... Вообще-то, т.к. указатель - это адрес в памяти, то ему должно быть пофигу на выравнивание. Скажем, если взять область BIOS, то там можно найти очень много переменных, которые занимают 2 байта (т.е. слово, т.е. int в 16-разрядных режимах) и начинаются с нечетного адреса. И что, теперь, нельзя мне завести указатель int* на это значение? По-моему, бред.

Хотя возможно, что на некоторых процессорах это ограничение и существует.

А вот когда память распределяется компилятором, тогда выравнивание производится. Например, int должен начинатся по четному адресу, long - по адресу, кратному 4-м. Плюс есть еще ограничения самого компилятора. Например, память выделяется не побайтно, а блоками. Блок равен 8-ми байтам и начинается с адреса, кратного 8-ми.

Т.е. если у тебя в программе будет такой код:

int * p;

p = malloc (sizeof (int));

то p будет кратно 8-ми, и выделено будет 8 байт, но использоваться будут ровно 2.

А для адресной арифметики тип имеет значение. Например, p++ на самом деле увеличит свое значение не на 1, а на 2 (подразумевается, что происходит переход на следующее значение в массиве, элементы которого занимают по 2 байта каждый).

p++ соотвествует такому оператору:
p = (int *) ((char *) p + sizeof (*p))

---------
Трудное - то, что можно сделать немедленно. Невозможное - то, для выполнения чего требуется немного больше времени
Ответ отправил: Ayl (статус: Профессор)
Отправлен: 07.07.2005, 17:33
Оценка за ответ: 5
Комментарий оценки:
мерси за исчерпывающий ответ, я сразу же вьехал в тему... :)

Отвечает: DSota
Здравствуйте, yatagan!

Раньше процессоры на выровненные адреса обращались быстрее... Например обращение к нечетному адресу у 386 вызывало 2 такта обращения к памяти:
сначала читались 16 бит с первого четного адреса, пол числа отбрасывалось, потом со второго адреса, половина отбрасывалась, сотавшиеся 2 половинки компоновались в нужное число... На это конечно тратились дополнительные такты процессора.
И сейчас есть процессоры такие, как R3000, R4000, которые при обращении к невыровненным адресам просто делают аварийную остановку.

---------
Открыть глаза навстречу солнцу.
Ответ отправил: DSota (статус: Практикант)
Отправлен: 08.07.2005, 11:15
Оценка за ответ: 5


Вопрос № 23.189
Respect, ***[KoderS]*** :D
I M ***[LvT]***
Я недавно начал изучать асм по WIN2,
и у меня возникло несколько вопросов:
Во-первых, как писать драйверы под
Win2k/XP, где скачать русскую версию DDK и SDK,
информацию про ToolHelp32 и Process Status API,
Вообще что-либо интересное про win32.
Я пишу сейчас прогу для защиты чужого кода методом
шифрования, Поэтому мне нужно еще туториалы по PE.
У меня есть Zelion'овские, но они недостаточно полные.
Где я могу скачать LuEvelSmeyer'а?
Как круто, что я нашел такую хорошую вещь, как ваша рассылка...
Заранее огромно благодарен...
P.S.:
А здесь есть программирующие девушки?
Отправлен: 07.07.2005, 21:07
Вопрос задал: Skarrywizzard (статус: Посетитель)
Всего ответов отправлено: 1

Отвечает: DSota
Здравствуйте, Skarrywizzard!

1. Все пишется на обычном MASM, как обычная программа для Виндовс... С использованием библиотек, позаимствованных из DDK... Отличие только при сборке...
2. Русских версий DDK и SDK не видел... Информации очень много на MSDN.COM
3. Скачать LuEvelSmeyer'а можно на:
http://www.wasm.ru/docs/2/pe_docs.zip
http://www.karland.com/code/c/
Ответ на PS: Есть...


---------
Открыть глаза навстречу солнцу.
Ответ отправил: DSota (статус: Практикант)
Отправлен: 08.07.2005, 11:49
Оценка за ответ: 5


Вопрос № 23.238
Я с вашей помощью написал программу для чтения содержимого файла.
Мне нужно следующее:
Сделать такой цикл, чтобы программа завершилась при отображении
последнего символа файла.
Мне приходит в голову одна идея,
заджампить цикл вывода файла до тех пор пока не всретится точка, а
вот как конец файла определить?

И ЕЩЕ ОДИН ВОПРОС, НА КОТОРЫЙ ОЧЕНЬ ХОЧУ ПОЛУЧИТЬ ОТВЕТ:
ЗАЧЕМ НУЖНО ПОМЕЩАТЬ ОПИСАТЕЛЬ ФАЙЛА В BX И ДЛЯ ЧЕГО НУЖЕН ЭТОТ ОПИСАТЕЛЬ?

Как я понял, то при выводе на экран программа
автоматически помещает следующий считанный символ из файла
справа от предыдущего символа.
И еще: Что произойдет, если не закрыть файл, а программа завершится?

Приложение:

Отправлен: 08.07.2005, 18:14
Вопрос задал: Терсков Алексей Николаевич (статус: Посетитель)
Всего ответов отправлено: 2

Отвечает: Ayl
Здравствуйте, Терсков Алексей Николаевич!

После чтения проверяешь значение флага CF и значение регистра AX.
Если CF установлен, то при чтении произошла ошибка, код которой находится в AX.
Если CF сброшен, то если AX = CX, то считано запрошенное число байт из файла. Можно продолжать чтение дальше.
Если AX < CX, то во время чтения обнаружен конец файла. Число реально прочитанных байт находится в AX.

В твоем случае (т.к. ты читаешь по одному байту) достаточно проверять регистр AX на 0:

..
int 21h ; чтение
jc @@Error ; если ошибка - обрабатываем
or ax, ax
jnz @@cont ; если что-то считали - продолжаем читать

2. Помещать дискриптор файла в BX нужно потому, что там его ожидает увидеть функция DOS. Нормально объяснил?
А вообще, т.к. ты одновременно можешь работать с несколькими файлами, то ОС необходимо знать, к которому из них ты в данном случае хочешь получить доступ.

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

---------
Трудное - то, что можно сделать немедленно. Невозможное - то, для выполнения чего требуется немного больше времени
Ответ отправил: Ayl (статус: Профессор)
Отправлен: 08.07.2005, 18:52

Отвечает: Евгений Иванов
Здравствуйте, Терсков Алексей Николаевич!
когда ты считываешь из файла, то функция 3Fh возвращает, ошибка ли или всё хорошо. и код ошибки. вот тебе и нужно этот код обрабатывать.
также эта функция возвращает, сколько она загрузила байт.
я же всё же посоветовал делать по другому!
нужно загрузить файл в буфер (буфер не менее 64 Кб лучше).
и работать с ним.
так намного быстрее будет работать.
описатель файла - это просто номерок. через него идёт работа после открытия файла. также файл закрывается с помощью номерка.
если же ты выйдешь, не закрыв файл, то система обычно сама закрывает номерки, но это только при выходе через 4Ch.

Удачи!
---------
Что имеем - не храним, потерявши - плачем
Ответ отправил: Евгений Иванов (статус: Профессор)
Отправлен: 08.07.2005, 22:47


Вопрос № 23.240
Вопрос по уроку 13 Калашникова про вирус
Меня полностью сбила с толку следущая команда
jmp dword ptr cs:[off_move]
Согласно синтаксису (jmp адрес_перехода) вместо cs должен стоять es!
Ведь cs указывает на текущий сегмент, а off_move есть смещение для следущего
оператора после jmp, те прыжок должен быть именно на следующую команду. Каким образом
ассемблер узнал,что здесь нужен переход на сегмент видеобуфера.Иными словами, почему
значение cs изменилось самопроизвольно? Почему произошел переход на 0BF00h?

зы: В моем почтовике outlook2003 почемуто не работает кнопка "оценить ответ эксперта". Может вопрос не в тему...
Отправлен: 08.07.2005, 19:24
Вопрос задал: Mazin Alexey Ivanovich (статус: Посетитель)
Всего ответов отправлено: 2

Отвечает: Евгений Иванов
Здравствуйте, Mazin Alexey Ivanovich!
адрес содержится в переменной, которая расположена по адресу cs:[off_move]
там смещение:сегмент находятся.
Удачи!

---------
Что имеем - не храним, потерявши - плачем
Ответ отправил: Евгений Иванов (статус: Профессор)
Отправлен: 08.07.2005, 22:41

Отвечает: Ayl
Здравствуйте, Mazin Alexey Ivanovich!

Потому что данная команда выполняет не прямой переход (jmp Label), а косвенный. В этом случае адрес перехода записывается либо в регистр, либо в переменную в памяти и в команде перехода указывается либо этот регистр, либо адрес памяти.

В данном случае в памяти по адресу cs:off_move расположен адрес точки назначения для дальнего перехода в формате сегмент:смещение, причем значение сегмента равно BF00.

Когда процессор доходит до команды jmp dword ptr cs:[off_move], он вначале извлекает из памяти по адресу cs:off_move двойное слово (на это указывает модификатор dword ptr), помещает младшее слово в регистр IP (смещение), а старшее - в регистр CS (сегмент). Вот поэтому в регистре CS и появляется значение BF00 - оно записано в памяти!

---------
Трудное - то, что можно сделать немедленно. Невозможное - то, для выполнения чего требуется немного больше времени
Ответ отправил: Ayl (статус: Профессор)
Отправлен: 11.07.2005, 12:38


Вопрос № 23.247
Вроде бы вопрос уже задовал, даже если задовал, то ответ просмотрел.
Какой делитель кроме нуля вызывает ошибку переполнения?
И еще мне никто не ответил цитата:
ошибка при копировании "Неправильная функция MS-DOS"
Такой message меня уже достал своей функцией MS-DOS.
Что за функция???
Отправлен: 08.07.2005, 22:06
Вопрос задал: Терсков Алексей Николаевич (статус: Посетитель)
Всего ответов отправлено: 2

Отвечает: Евгений Иванов
Здравствуйте, Терсков Алексей Николаевич!
деление на ноль - это исключение.
это когда результат не умещается в destination.
слишком большой.
---------
Что имеем - не храним, потерявши - плачем
Ответ отправил: Евгений Иванов (статус: Профессор)
Отправлен: 08.07.2005, 22:18

Отвечает: Ayl
Здравствуйте, Терсков Алексей Николаевич!

Ошибка Divide by zero возникает при выполнении операции деления, если результат не помещается в отведенное место. Т.к. при делении выполняется деление двойного операнда (двойное слово или слово) на одинарный (слово или байт) и результат (частное и остаток) помещаются в одинарный операнд, то при делении большого числа на маленькое может произойти эта ошибка.
Например, т.к. 25000 / 10 = 2500 > 256, то при делении AX = 25000 на BL = 10 получим ошибку деления на 0. Выход - записать 25000 в регистры DX:AX (DX = 0, AX = 25000) и производить деление на регистр BX = 10. Тогда ошибки не произвойдет и в результате AX = 2500, DX = 0.

---------
Трудное - то, что можно сделать немедленно. Невозможное - то, для выполнения чего требуется немного больше времени
Ответ отправил: Ayl (статус: Профессор)
Отправлен: 11.07.2005, 12:46


Вопрос № 23.268
Обьясните мне пожплуйста, если можно подробнее.
Желательно очень подробно, назначение следующих команд:
JC -
NOP -
И для чнго они применяются особенно NOP.
NOP - вероятнее всего переводится как (No operation).
Отправлен: 09.07.2005, 13:10
Вопрос задал: Терсков Алексей Николаевич (статус: Посетитель)
Всего ответов отправлено: 2

Отвечает: Евгений Иванов
Здравствуйте, Терсков Алексей Николаевич!
JC - переход по условию "меньше".
Это если флаг CF установлен.
например
mov eax, 64
cmp eax, 100
jc less
тут будет переход.
cmp eax, 64
jc less
тут не будет!
jz equal
будет

удачи!

---------
Что имеем - не храним, потерявши - плачем
Ответ отправил: Евгений Иванов (статус: Профессор)
Отправлен: 09.07.2005, 14:28

Отвечает: Ayl
Здравствуйте, Терсков Алексей Николаевич!

jc - jump if carry (CF). Переход, если флаг переноса установлен. Используется очень часто. Например, все функции BIOS для файлового ввода-вывода сигнализируют о результате выполнения с помощью этого флага. Если он установлен - значит, произошла какая-то ошибка.

nop - no operation, нет операции... Эту команду можно применять, скажем, для выравнивания, для удаления ненужного кода, для резервирования места...
---------
Трудное - то, что можно сделать немедленно. Невозможное - то, для выполнения чего требуется немного больше времени
Ответ отправил: Ayl (статус: Профессор)
Отправлен: 11.07.2005, 12:50


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

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

* Код программы, выдержки из закона и т.п. дополнение к вопросу.
Эта информация будет отображена в аналогичном окне как есть.

Обратите внимание!
Вопрос будет отправлен всем экспертам данной рассылки!

Для того, чтобы отправить вопрос выбранным экспертам этой рассылки или
экспертам другой рассылки портала RusFAQ.ru, зайдите непосредственно на RusFAQ.ru.


Форма НЕ работает в почтовых программах The BAT! и MS Outlook (кроме версии 2003+)!
Чтобы отправить вопрос, откройте это письмо в браузере или зайдите на сайт RusFAQ.ru.


© 2001-2005, RusFAQ.ru, Россия, Москва. Все права защищены.
Идея, дизайн, программирование, авторское право: Калашников О.А.

Яндекс


Subscribe.Ru
Поддержка подписчиков
Другие рассылки этой тематики
Другие рассылки этого автора
Подписан адрес:
Код этой рассылки: comp.soft.prog.faq
Отписаться
Вспомнить пароль

В избранное