|
|
| Посл.отвђт | Сообщен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 байту. Идёт обращение конкретно к биту с отрицательным индексом по отношению к нулевому базовому. До сих пор этот момент как-то ускользал от меня :) Трактовка действительно знаковая. |
|
Powered by miniBB 1.6 © 2001-2002
Время загрузки страницы (сек.): 0.104 |