· Начало · Отвђтить · Статистика · Поиск · FAQ · Правила · Установки · Язык · Выход · WASM.RU · Noir.Ru ·

 WASM Phorum —› WASM.BOOKS —› Юров. Специальный справочник.

. 1 . 2 . 3 . >>

Посл.отвђт Сообщен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 в частности.

. 1 . 2 . 3 . >>


Powered by miniBB 1.6 © 2001-2002
Время загрузки страницы (сек.): 0.142