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

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

<< . 1 . 2 . 3 . >>

Посл.отвђт Сообщенiе


Дата: Сен 16, 2003 23:45:03 · Поправил: The Svin

стр. 37. Пример использования AAD.
Цитата:

mul ah ;al = 48h - двоичный эквивалент числа 72
aam ;ah = 07, al= 02
or ax,3030h ;ax = 3732 - ASCII представление числа 72

Замечание:
Это ASCII представление числа 27 :)
Старшие разряды в Европе пишут слева. Поэтому старший разряд должен
находится в младшем байте.
Нужно поменять байты-символы-разряды местами, или xchg ah,al или ror/rol ax,8.

то же касается следующего примера на этой же странице:
Цитата:

mov ax,60h ;ax=60h
aam	   ;ax=0906h - получили десятичный эквивалент числа 60h
or ax,3030h ;символьный эквивалент ax=3936h
	   ;можно выводить на экран



Замечание:

Вывести можно, только мы получим 69 вместо 96 если не изменим порядок байт.


Дата: Сен 16, 2003 23:57:54

стр. 37. Машинный код AAS

Цитата:
Машинный код: 3A

Грубая ошибка.
Машинный код AAS = 3F.
3A относится к группе 001110 d w : modr/m
операции CMP
т.е. cmp операнды в modr/m
в частности при форме 3A (d=1 w=0) будет сравниваться
8и битный регистр в codr байта modrm с операндом байтом адресуемым через memr.


Дата: Сен 17, 2003 03:07:05

стр. 37. Алгоритм работы AAS.

Цитата

Если (младший полубайт регистра al меньше 9) или (флаг AF=1)
* уменьшить значение младшего полубайта регистра al на 6
* обнулить значение старшего полубайта регистра al
* установить AF и CF в 1
иначе установить AF и CF в 1


Ошибки:
Ну просто тучка ошибок в одном коротком описании.
1. должно быть: ...младший полубайт al больше 9.
2. не сказано что при этом условии ещё уменьшается AH.
3. эту ошибку увидит даже тот кто и ассемблера в глаза не видел:

* установить AF и CF в 1
иначе установить AF и CF в 1

конечно же должно быть:


* установить AF и CF в 1
иначе сбросить AF и CF в 0


Далее неверно указано место в алгоритме где обнуляется старшая половина AL.
Она обнуляется уже в конце после проверки условий и выполнения шагов по ветвлению
Т.е. по просту говоря обнуляется всегда.
Например:
mov AL,18h
aas
В этом случае не будут соблюдены условия (al and 0F > 9) или (AF=1)
и не будет уменьшения AL на 6, уменьшения AH и установки флагов в 1.
Но результат в AL будет 08, т.е. старший полубайт обнулится.

Обнуление старшего полубайта в AL будет происходить всегда в AAS
независимо он условий.


Дата: Сен 17, 2003 07:36:33

стр. 39. ADC. Формат ADC

Формат reg/mem16-32, imm8 зачем-то выписан отдельно
в конце, хотя он и так входит в группы описанные выше.
В группах описанных выше специально s бит обозначенн переменной
s, поэтому оправдание что он хотел подчеркнуть формат
при несоразменых операндах тут не катит. s как раз и предпологает
при установке в 1 ужимание полного непосредсвенного операнда
до размера знакового байта.


Дата: Сен 17, 2003 19:46:11

стр. 39. ADC. Алгоритм работы ADC
Цитата:

* Сложить два операнда
* поместить результат в первый операнд: приемник=приемник+источник
* в зависимости от результата установить флаги


Замечание:
В алгоритме почему-то ни слова не сказанно о прибавлении CF :)
Хотя в переводе, и применении о этом упоминается.
Разумеется должно быть:
приемник=приемник+источник+CF.


Дата: Сен 17, 2003 20:56:16

стр. 42. Пример использования команды AND
Цитата:
Например, преобразуем двухзначное упакованное
BCD число в его символьный эквивалент.

uBCD db 25	;упакованное BCD-число
s_ch dw 0	;место для результата

...
	xor ax,ax	;очистка ax
	mov al,uBCD	
	shl ax,4	;ax=0250
;преобразование в символьное представление
	and ax,3F3F	;ax=3235      !!!!!!!!
	mov s_ch,ax


Коментарий :)
Обратим внимание на эти гениальные строчки
shl ax,4 ;ax=0250
;преобразование в символьное представление
and ax,3F3F ;ax=3235 !!!!!!!!

Получается 0250h and 3F3Fh = 3235h :)
Я своим крестьянским умом понимаю что там окажется 0215h

тут сразу две програмные ошибки у автора.
1. Он видимо хотел сделать из упакованого BCD неупакованное
но получил вместо 0205 (или пусть 02x5 c мусором в старшей тетраде младшего
байта) число 0250
можно было выкрутится сделав shr al,4
но тогда для AND уже никакой работы не оставалось бы - все старшие
тетрады и так стали бы нулями.
2. Он каким то образом предположим что теперь у него в ax 3235 or какой-то мусор
который он пытается сбросить маской 3F3F, но откуда там выставились биты
00110010 00110101 совершенно непонятно.


Дата: Сен 17, 2003 23:02:29

стр. 42 статья о ARPL

Замечание:
Не указано что операндами могут быть в том числе и 32х
разрядные регистры.
Так же не слова о том, что в RM и VM применение этой
инструкции вызывает особый случай #UD. Неопознаный код операции.


Дата: Сен 19, 2003 07:31:53

стр. 47-48. Описание работы команды BT
Цитата:

Номер проверяемого бита задаётся содержимым второго
операнда индекс (значением диапозона 0...31).

Ошибка:
Значение диапозона от 0 до 31 только если первый операнд
регистр. Если бит проверяется в памяти диапозон не ограничен.
(разве что может произойти обращение к "запретной" памяти
и произойти особый случай нарушения общей защиты).

Любопытно, что у самого Intel в описании диапозона сказана
фраза которая у меня вызывает недоумение:
The offset operand then selects a bit position
within the range -2^31 to 2^31 -1
for a register offset and 0 to 31 for an immediate offset.

Непонятно как минус (2 в 31ой степени) может влезь в регистр :/


Дата: Сен 19, 2003 21:01:39 · Поправил: Black_mirror

Если первый операнд регистр или номер бита задан как непосредственный операнд, то берутся только младшие 5 бит. А если первый операнд ячейка памяти и второй операнд регистр, то тогда мы можем получить номер до 2^31.


Дата: Сен 20, 2003 00:26:30

Так и написал, непонятно что за минус 2^31 имеет ввиду Intel. Почему не 0..2^31 -1 ?


Дата: Сен 20, 2003 00:51:53

Да, я подумал, что определение о младших 5и битах будет тут более правильно. Иначе (определяя просто через max=31) непонятно а что будет если больше. С указанием в определении на младшие 5 битов понятней, что старшие будут просто игнорироваться.


Дата: Сен 20, 2003 00:59:03 · Поправил: Black_mirror

Проверка показала что отрицательные номера бит также допустимы. То есть если мы напишем bt dword [adr],eax, то при eax=-1 мы получим самый старший бит dword'а с адресом adr-4, при eax=-64 мы получим младший бит dword'а с адресом adr-8. Но если мы напишем bt dword [adr],im8 то от im8 будут взяты только младшие 5 бит.
[added]
Если первый операнд слово, то процессор возьмет только 4 бита.
[/added]


Дата: Сен 20, 2003 01:11:52

Дык -2^31 влезает в 32-битный регистр :)))


Дата: Сен 20, 2003 03:10:52

Тьфу ты,
блин дошло. Привычка думать категорией 2^32-1 и максимально возможная полная положительная = 2^31.
- 2^31 конечно же влезет. Это 80000000h.
Вот ведь позор на мою седую голову.
Всё правильно в доках Intel написано - от 2^31-1(7FFF FFFFh) до - 2^31(8000 0000h)


Дата: Сен 20, 2003 05:23:25

Однако любопытная вещь, при указании индекса через регистр он действительно воспринимается как знаковое число. Т.е. можно работать с bt,btr,btc,bts с отрицательным индексом.
Например,
or ecx,-1
btr [eax+4],ecx
в действительности снимет старший бит, из dword по адресу
[eax]. Т.е. бита который по отношении к нулевому в цепочке
начинающийся с eax+4 будет минус первым.

Ошибка у Юрова в отношении всей bt(x) группы остаётся в смысле диапозона.
При этом наиболее логичным и точным будет определение
c пояснениями данными Black_mirror и Intel.
А именно, первый операнд регистр то:
Если первый операнд регистр или номер бита задан как непосредственный операнд, то берутся только:
1. младшие 4 бита если операнд 16и битный регистр.
2. младшие 5 бит если первый операнд регистр или номер бита задан как непосредственный операнд.

Если же первый операнд - память а второй регистр.
То диапозон определяется в пределах всего множества
чисел которые может определить этот регистр, НО! при этом
число воспринимается как знаковое!
Т.е. например, при втором операнде = -1 будет производится
работа со старшим (7м) битом байта адрес которого на 1 меньше чем адрес памяти указанный через первый операнд.
При втором операнде = -2 с 6м битом предыдущего байта, -3
с пятым и т.д.
Видно из такого простого теста.
В дебагере:
Установите в каком -то DWORD x 00000000h
Дальше:
mov eax,offset x+4
or ecx-1
@@: bts [eax],ecx
loop @B
И шагаем - наблюдаем как dword x биты начинают заполнятся
от старшего к младшему с каждой итерацией.

Т.е. нет обращения к текущий + FFFFFFFFh /8 байту.
Идёт обращение конкретно к биту с отрицательным индексом
по отношению к нулевому базовому.
До сих пор этот момент как-то ускользал от меня :)
Трактовка действительно знаковая.

<< . 1 . 2 . 3 . >>


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