|
|
| Посл.отвђт | Сообщенiе |
|
|
Дата: Сен 10, 2003 11:44:15 · Поправил: The Svin Юров. Специальный справочник. Питер. 2000. Этот топик только для собирания конкретных ошибок и замечаний по указанному изданию. Пожалуйста, ничего другого сюда не пишите. стр.19. Схема строения опкода цитата: Однобайтные префиксы повторения размера адреса размера операнда замены сегмента блокировки шины Замечание: Отсутсвует упоминание о префиксах 2E,3E - branch hints. 2EH-Branch not taken (used only with Jcc instructions). 3EH-Branch taken (used only with Jcc instructions). |
|
|
Дата: Сен 10, 2003 11:57:03 · Поправил: The Svin стр.21. Описание указания на sib Цитата: На наличие байта sib в машинной команде указывает сочетание одного из значений 01 или 10 поля mod и значения поля r/m = 100 Ошибка. Поле mod может также иметь значение 00. Т.е. любое значение кроме 11. |
|
|
Дата: Сен 10, 2003 12:10:24 · Поправил: The Svin стр.21. Описание поля масштаба ss Цитата: поле ss может содержать одно из следующих значений: 1,2,4,8 Ошибка: Обратим внимание, что речь идёт о двухбитном поле! ss. Оно никак не может "вместить" ни 4 ни 8. Поле ss содержит значение показателя степени двойки. 0,1,2,3. А не сам множитель. Множителем будет два в степени ss. Или можно ещё воспринимать это так: Значение индексного регистра будет сдвинуто на ss бит влево. |
|
|
Дата: Сен 10, 2003 12:17:09 стр. 22. Описание поля base Цитата: Напомню, что в качестве базового и индексного регистров могут исипользоваться практически все регистры общего назначения Замечание: esp не может использоваться в качестве индексного регистра. |
|
|
Дата: Сен 10, 2003 12:27:43 стр. 24 Схема бит регистра eflags Цитата: 31 18 17 0 0 VM ... Ошибка: 18ый бит не является обязательно нулевым - это флаг AC Alignment Check. |
|
|
Дата: Сен 10, 2003 19:36:35 · Поправил: The Svin стр.25. Таблица префиксов Цитата: Таблица 1. Замечание: Опять отсутствуют префиксы 2E,3E. стр.26. О значении бита D в дескрипторах сегмента и влиянии на размер операнда Цитата: В защищённом режиме эти значения зависят от значения бита D в дескрипторе сегмента. Примечание. IMHO лучше было бы уточнить, "в дескрипторе сегмента кода". Т.е. всё что касается текущего "полного" размера определяется тем на какой индекс дескриптора указывает CS, и что там с бито D в этом дескрипторе. На что показывают другие сегментные регистры значения не имеет. |
|
|
Дата: Сен 10, 2003 20:06:07 · Поправил: The Svin стр. 27. Таблица 2. Описание бита w Цитата: w - Определяет размер данных которым оперирует команда: байт, слово, двойное слово. Примечание: Написано так, что можно подумать, что с помощью w можно определить разницу в том числе и между словом и двойным словом. Тем не менее бит w определяет лишь разницу байт или "полный операнд". При этом "полный" может быть словом или двойным словом, что в свою очередь определяется текущим размером операнда по умолчанию и наличием префикса 66h. Если нужно было коротко, лучше было бы написать что-то вроде: байт или слово\двойное слово. |
|
|
Дата: Сен 10, 2003 20:52:36 стр. 29. Описание интерпретации бита d Цитата: Если в команде учавствуют два регистра, то в этом случае вступает в силу правило: поле reg определяет второй операнд а поле r/m первый операнд Ошибка: Никакого такого правила не существует. Бит d будет по прежнему интерпретировать направление операндов даже если используются одни регистры (mod=11). При этом появляется возможность кодировать modr/m двумя различными значения для получения одного и того же результата. При mod=11 достаточно инвертировать значение d и поменять местами значения полей cod/r <-> mem/r и мы получим тот же результат. пример. d=1 mov eax,ecx. Код 8B C1. Жирным - бит d блок кода 10001011:11 000 001 Второй байт(11 000 001) -modr/m 11 - mod 000 - регистр eax 001 - регистр ecx Направление передачи d=1 - из mem/r в cod/r --- Теперь меняем бит d на 0 и меняем местами значения в cod/r и mem/r 10001001:11 001 000 В hex 89 C8. Это тоже mov eax,ecx. Проверить "работоспособность" можно в течении секунд в любом дебагере. |
|
|
Дата: Сен 13, 2003 01:02:19 стр. 29. Определение прямой адресации (самый конец страницы) Цитата: Единственное сочетание, которое позволяет реализовать прямую адресацию, возникает при mod=00 и r/m=011. Сразу несколько ошибок. 1. Способы кодирований прямой адресации несколько. 2. В зависимости от режима (разрядности) адресации они отличаются. 3. !!! Не один из способов не реализуется как написано автором (т.е. mod=00 и r/m =011 - никакой прямой адресации так не сделать) Вот эти способы (описываю бесплатноJ) В 16и битной адресации способ один: В байте modr/m mod=00 и r/m=110. Далее за байтом modr/m должен следовать непосредственный 16и битный операнд который представляет собой смещение. В 32х битной адресации таких способа два - с байтом sib и без него: 1. Без sib - в modr/m mod=00 и r/m=101. Далее за байтом modr/m следует непосредственный 32х битный операнд, который представляет собой смещение. 2. С байтом sib. В байте modr/m mod=00 и r/m=100. Далее байт sib в нём ss = 00, index=100,base=101. Далее за байтом sib следует непосредственный 32х битный операнд, который представляет собой смещение. |
|
|
Дата: Сен 13, 2003 01:29:54 Далее на страницах 30,31,32 идут таблицы. Где даются HEX коды байтов mod/r и sib с перекрёсными расшифровками. Я их не проверял. Если здесь ей пара людей, которым интересно моё мнение - само наличие подобных таблиц у Юрова и у Intel (у них ещё для кодов есть), и пользование их - полный идиотизм и вредительство. Достаточно знать пригоршню значений битовых полей и несколько простых правил чтобы раскодировать или декодировать любое значение sib или modr/m быстрее чем вы успеете открыть страницу с нужной таблицей ещё не начав искать в ней нужное одно из 256! значений. Это всё равно что вместо того чтобы запомнить год месяц и день рождения вы стали бы переводить это в колличество дней от рождества Христова и запоминать результат, чтобы потом результат обратно перевести в год месяц и день. |
|
|
Дата: Сен 13, 2003 01:46:10 стр. 32. Конец страницы. Цитата: Заметье, что одно из значений базового регистра (base) помечено символом "*". Это означает наличие в команде адреса смещ_32 без базы, если mod равно 00, и [esp] - в противном случае. Ошибка: Звёздочкой помечен код 101. Должно быть: ... и [ebp] в противном случае. |
|
|
Дата: Сен 13, 2003 03:22:04 стр.35. Пример для статьи про AAA. Цитата: К примеру, сложить два неупакованных BCD числа, 08+05: mov ah,08 ;ah=08 mov al,03 ;al=03 add al,ah ;al=al+ah=05+08=0dh - не BCD число. xor ah,ah ;ah=0 aaa ;ah=01,al=03 - результат скорректирован. Замечание: Вопиюще неудачный пример! Это поймёт любой кто хоть что-то понимает в позиционных системах и "симуляции переполнения" которое производится командой AAA. Похоже, к сожалению, эта группа невелика. Неудачным является в примере предпоследняя строка xor ah,ah - она сбросит AF. Хотя Intel и пишет что при xor AF "undefined" (что впрочем и так достаточный повод не использовать здесь xor) в реальности на большинстве современных моделей он сбрасывается после XOR. Т.е. если бы в примере нужно было бы в примере сложить, например, 9+9 то результатом бы оказалось ah = 0 al = 2! Само использование ah здесь крайне странно, учитывая что часто используется при работе с AAA двухзначное число - неупакованное BCD со старшим разрядом в AH. Но если очень уж хотелось в качестве операнда использовать AH то команду xor ah,ah нужно было заменить на mov ah,0 которая ни по размеру ни по скорости не уступит xor ah,ah. Тогда при любых валидных значениях в ah и al пример бы работал. |
|
|
Дата: Сен 13, 2003 04:27:37 стр. 35. Машинный код для AAD Цитата: Машинный код: D5 0A. Примечание: Думаю следовало бы сказать, что 0A здесь - непосредственный операнд множетель. И что для опкода D5 он может быть любым. |
|
|
Дата: Сен 16, 2003 22:25:10 стр. 35. Примечание к команде AAD Цитата: Есть ещё один интересный момент: если посмотреть на коды символов шестнадцатеричных цифр в таблице ASCII, то видно, что они похожи на BCD числа. Замечание: Очевидно тут неправильно построенна фраза, из которой например может последовать неверный вывод что, скажем кода для шестнадцатеричной десятки A (41h) чем то похож на BCD число. Наверное фраза должна была звучать приблизительно так: "...если посмотреть на шестнадцатеричные (HEX) коды десятичных цифр в таблице ASCII.." |
|
|
Дата: Сен 16, 2003 23:24:27 стр. 36. Машинный код AAM Цитата: Машинный код D4 0A Примечание: Как и в случае с командой AAD следовало бы упомянуть что 0A здесь - непосредственный операнд делитель, и вообще-то может быть любым числом в пределах байта. Что так же ведёт к выводу, что D4 00 приведёт к особому случаю деления на 0 в частности. |
|
Powered by miniBB 1.6 © 2001-2002
Время загрузки страницы (сек.): 0.142 |