| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > Asm для начинающих > Циклический сдвиг двойных слов |
| Автор: Vandalko 15.3.2009, 21:10 | ||||||||
Ести пример из методички по цикличному сдвигу двойных слов:
Компилируется это горе(учитывая количество ошибок) только в таком виде:
Но проверка в отладчике показала на ошибку уже при первом проходе цикла... Но у меня есть подозрение
на:
Знатоки, подскажите, как выполнить циклический сдвиг двойных слов используя команду shrd |
| Автор: Mikl_ 16.3.2009, 12:53 | ||
| Vandalko, команда move eax,ebx+4[esi*4] на "правильном" ассемблере должна выглядеть так: mov eax,[ebx+esi*4+4] а если принять во внимание команду lea ebx,block, то обе команды lea ebx,block и mov eax,[ebx+esi*4+4] можно заменить на одну mov eax,blok[esi*4+4]
|
| Автор: Vandalko 16.3.2009, 14:57 | ||
| огромное спасибо за обьяснение, но что если нужно выполнить циклический сдвиг 121 раз ? тогда этот пример не подходит... Давайте вернемся к моей реаизации - вот, программа после некоторых исправлений, но к сожалению программа вылетает с ошибкой...
|
| Автор: Mikl_ 16.3.2009, 15:36 | ||
Vandalko,
|
| Автор: Vandalko 16.3.2009, 16:57 | ||
| OllyDbg мне пока сложноват - учить надо А вот Turbo Debugger самое оно... Вобщем компилил-компилил я это чудо на 32битном masme и так ничего и не добился... Все решилось после компиляции на 16битном masm Конечный вид програмы(если есть желание - просмотрите и скажите есть ли тут хоть доля правильности Я ведь правильно понимаю, что 0000h-FFFFh это двойное слово ?
Во всяком случае спасибо за советы Програма дополнилась новым заданием - вывести информацию о количестве последовательных портов... Добыть саму информацию было несложно, но вот как теперь вывести ее на экран ? Обратите внимание на выделеный участок кода. По идее он должен бы вывести число, но... ничего так и не выводит.... |
| Автор: Mikl_ 17.3.2009, 05:07 | ||
| Vandalko, 1) не плохо свои листинги снабжать комментариями, если ты DOS только изучаешь, то я за 20 лет его забыл окончательно. Да и в практическом программировании DOS не применяется 2) если вврху листинга нет директивы .radix 2 или .radix 8 или .radix 16, то снабжать десятичные цифры спецификатором d как в этой команде mov ecx,6d не нужно -- это только вводит в заблуждение, другое дело если у тебя установлено .radix 16, тогда 6Dh=109 3) это что за бред shrd [ebx+esi*4],eax,121 32-разрядный регистр или ячейку памяти больше чем на 32 бита не сдвинуть -- разрядов не хватает! 4) не правильно, число в диапазоне от 0000h до 0FFFFh (от 0 до 65535) это слово, двойное слово это число в диапазоне от 00000000h до 0FFFFFFFFh (от 0 до 4294967295) 5) прерывание 11h - получить список оборудования; возвращает в регистре AX список оборудования BIOS; в регистре AX в 9-11 разрядах число установленных последовательных портов
|
| Автор: Vandalko 17.3.2009, 19:00 |
| спасибо за комментарии... shrd [ebx+esi*4],eax,121 - ну, нужно ведь выполнить циклический сдвиг на 121 бит... этот вариант скомпилился и я его оставил Теперь вопрос по отладчику - скажем мне нужно переслать какието данные в сегмент кода, как это можно увидеть в отладчике ? Я имею ввиду не факт пересылки а присутствие этих данных (если конечно такое возможно, ибо mov cs:0100,temp компилится, но каких то изменений в отладчике не наблюдается - хотя, учитывая мой опыт работы с ASM скорее всего я просто незнаю как их увидить)? По поводу вывода количества последовательных портов, то код в предыдущим варианте был не конечным вариантом - я потом доделал и все нормально работало, но во всяком случае спасибо за Ваш алгоритм - он будет третьим P.S. P.S.2. Мальчик я, мальчик... |
| Автор: Mikl_ 18.3.2009, 06:31 | ||
Ну или как вариант, сдвигаем на четыре переменные вправо, а потом 32-25=7 осужествляем циклический сдвиг влево на 7 бит иначе если ты сдвигаешь вправо или влево на 32 или больше разрядов в твой переменной будут нули во всех разрядах! |
| Автор: Mikl_ 19.3.2009, 10:48 | ||
Vandalko,
|
| Автор: YDI 14.4.2009, 01:47 | ||
Ув. товарищи, почти эта же прога, при компиляции выдает ошибку "деление на ноль". Укажите где промах.
|
| Автор: Mikl_ 14.4.2009, 03:37 |
| YDI, .model tiny подразумевает создание COM-файла, у которого сегмент кода, стека и данных сосредоточены "в одном флаконе" (в одном сегменте |