Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Замена значений в форматированном массиве 
V
    Опции темы
froggy82
Дата 2.10.2006, 12:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 52
Регистрация: 25.9.2006
Где: Архангельск

Репутация: нет
Всего: нет



Итак известно:

тип массива Word;
признак окончания 255 (Это последний элемент массива, если в цикле встретилось данное число, выходим из цикла, так как элементы массива закончились. Если число не указано, то нулевой элемент массива – это его длина (количество элементов массива - 1), и элементы массива начинаются с первого элемента. В любом случае эти крайние элементы (нулевой или последний) не должны участвовать в вычислениях при выполнении задания;

Задание:

Если элемент массива равен 3, заменить его на 33. Результат поместить в тот же массив....

Я не спорю, что это некрасиво просить решить простенькую задачку, но я действительно не понимаю с чего начать и как закончить  smile  , учусь на очно-заочном, и работа отнимает много времени, наведите на путь истинный?  smile 
PM MAIL ICQ   Вверх
nobodyzzz
Дата 3.10.2006, 15:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 13
Регистрация: 1.9.2006
Где: Минск

Репутация: нет
Всего: нет



//нашел баг =) исправляю
Код

mov si, offset array
mov di, si
_loop:
lodsw
inc al
jz exit
dec al
cmp ax, 3
jnz next
mov ax, 33
next:
stosw
jmp _loop



Это сообщение отредактировал(а) nobodyzzz - 4.10.2006, 13:17
PM MAIL   Вверх
froggy82
Дата 3.10.2006, 15:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 52
Регистрация: 25.9.2006
Где: Архангельск

Репутация: нет
Всего: нет



nobodyzzz, 
как я понял si и di это переменные? 

sergejzr,  прошу прощения, этого не повторится smile 
PM MAIL ICQ   Вверх
Damarus
Дата 3.10.2006, 16:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Awaiting Authorisation
Сообщений: 671
Регистрация: 6.5.2006

Репутация: нет
Всего: 29



Цитата(froggy82 @  3.10.2006,  16:35 Найти цитируемый пост)
как я понял si и di это переменные? 

Это регистры.
PM MAIL ICQ Jabber   Вверх
froggy82
Дата 4.10.2006, 08:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 52
Регистрация: 25.9.2006
Где: Архангельск

Репутация: нет
Всего: нет



Цитата(Damarus @ 3.10.2006,  16:56)
Цитата(froggy82 @  3.10.2006,  16:35 Найти цитируемый пост)
как я понял si и di это переменные? 

Это регистры.

В каждом регистре общего назначения выделяют младшую часть, как самостоятельный регистр (их тоже 8 – AX, BX, CX, DX, BP, SP, SI и DI).  Соответстввенно можно ли использовать любой из этих восьми?
PM MAIL ICQ   Вверх
Damarus
Дата 4.10.2006, 09:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Awaiting Authorisation
Сообщений: 671
Регистрация: 6.5.2006

Репутация: нет
Всего: 29



Цитата(froggy82 @  4.10.2006,  09:11 Найти цитируемый пост)
В каждом регистре общего назначения выделяют младшую часть, как самостоятельный регистр (их тоже 8 – AX, BX, CX, DX, BP, SP, SI и DI).  Соответстввенно можно ли использовать любой из этих восьми?

Только SP - стековый указатель. Его лучше не трогать.

Добавлено @ 09:13 
Без необходимости smile .
PM MAIL ICQ Jabber   Вверх
dumb
Дата 5.10.2006, 01:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


sceloglauxalbifacies
****


Профиль
Группа: Экс. модератор
Сообщений: 2929
Регистрация: 16.6.2006

Репутация: 7
Всего: 158



общего назначения - ax, cx, dx, bx. они делятся на половинки. остальные - нет.

Цитата(froggy82 @  2.10.2006,  12:04 Найти цитируемый пост)
тип массива Word;
признак окончания 255

есть предположение, что кто-то допустил "ляп" в условии. лучше уточнить у того, кто давал задание, не -1 ли имелась ввиду(в случае элементов word - это 65535(ffff)).

Цитата(nobodyzzz @  3.10.2006,  15:11 Найти цитируемый пост)
Код

inc al
jz exit
dec al

опять мухо. если считать, что условие задачи верно, то тут не учитывается старшая половина слова, а если ориентироваться на "правильную" -1, то нужно "inc ax"...

"mov ax, 33" можно на "mov al, 33" заменить - целый байт экономии! smile
PM MAIL   Вверх
froggy82
Дата 5.10.2006, 08:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 52
Регистрация: 25.9.2006
Где: Архангельск

Репутация: нет
Всего: нет



Цитата(dumb @ 5.10.2006,  01:59)
есть предположение, что кто-то допустил "ляп" в условии. лучше уточнить у того, кто давал задание, не -1 ли имелась ввиду(в случае элементов word - это 65535(ffff)).

Я думаю задание верное. так как в других вариантах признаки окончания либо 0, либо 127, либо 255 или - , т.е. число не указано, то нулевой элемент массива – это его длина (количество элементов массива - 1).

Добавлено @ 08:37 
Цитата(dumb @  5.10.2006,  01:59 Найти цитируемый пост)
Цитата(nobodyzzz @  3.10.2006,  15:11 )
код Ассемблера
1:
2:
3:

inc al
jz exit
dec al






опять мухо. если считать, что условие задачи верно, то тут не учитывается старшая половина слова


В смысле поясни? Что нужно сделать, чтобы учитывалось?
PM MAIL ICQ   Вверх
nobodyzzz
Дата 5.10.2006, 10:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 13
Регистрация: 1.9.2006
Где: Минск

Репутация: нет
Всего: нет



Цитата

В смысле поясни? Что нужно сделать, чтобы учитывалось? 

Код

inc al
jz exit
dec al

можно заменить на
Код

cmp ax, 255
jz exit


PM MAIL   Вверх
froggy82
Дата 5.10.2006, 11:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 52
Регистрация: 25.9.2006
Где: Архангельск

Репутация: нет
Всего: нет



Итак, как я понял итоговым кодом будет следущее?

Код

mov si, offset array
mov di, si
_loop:
lodsb
cmp al, 255
jz exit
cmp al, 3
jnz next
mov al, 33
next:
stosb
jmp _loop


......на словах получается что мы узнаем по какому адресу в памяти расположена переменная array, затем считываем ее значение из памяти в регистр di .
Далее загружаем слово из цепочки в регистр al, тут все таки решил сэкономить целый байт  smile  командой lodsb. сравниваем значение 255 со значением в регистре al. если сходятся, выходим из цикла.
Далее сравниваем 3 c al, если элемент схож заменяем его на 33 и записываем в тот же массив.........

А теперь то ЧТО НЕПОНЯТНО

если заменяем элемент на 33 то зачем прыгать на начало цикла, если задача выполнена, может поставить 
exit: ?
И еще можете пояснить  что мы сравниваем? числа? то есть переменная это обычное число? 

Это сообщение отредактировал(а) froggy82 - 5.10.2006, 11:36
PM MAIL ICQ   Вверх
dumb
Дата 5.10.2006, 13:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


sceloglauxalbifacies
****


Профиль
Группа: Экс. модератор
Сообщений: 2929
Регистрация: 16.6.2006

Репутация: 7
Всего: 158



Код

mov si, offset array ; загружаем в si начало массива
mov di, si           ; в di - тоже
_loop:
lodsw                ; загружаем из ds:si элемент массива в ax (word)
                     ; значение si увеличивается на размер вычитываемого элемента(2 - word)
cmp ax, 3            ; сравниваем с искомым значением
jnz _next            ; если не равно - пропускаем изменение
mov al, 33           ; меняем значение на 33. тут используется только al потому,
                     ; что в старшей части(ah) точно 0(ax = 3, т.е. ah = 0, al = 3).
_next:
stosw                ; записываем ax в es:di
                     ; значение di увеличивается на размер записываемого элемента(2 - word)
cmp ax, 255          ; сравниваем со значением "конечного элемента"
jnz _loop            ; если не равно - следующая итерация

PM MAIL   Вверх
froggy82
Дата 6.10.2006, 07:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 52
Регистрация: 25.9.2006
Где: Архангельск

Репутация: нет
Всего: нет



dumb, Спасибо в воскресение узнаю, правильно ли ....
PM MAIL ICQ   Вверх
froggy82
Дата 16.10.2006, 07:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 52
Регистрация: 25.9.2006
Где: Архангельск

Репутация: нет
Всего: нет



dumb,  спасибо, еще раз, ответ почти правильный, вот что вышло у меня в итоге:
Надо было использовать 32 разрядный регистр, и так как команда stosw некорректна, т.к. записывает значение уже на шаг вперед, используем более простые команды.
Код

.data
array dw 1, 3, 30, 33, 255
.code
mov esi, offset array
cycle:
lodsw
cmp ax, 3
jnz next
mov al, 33
sub esi, 2
mov [esi], al 
next:
cmp ax, 255
jnz cycle

PM MAIL ICQ   Вверх
dumb
Дата 17.10.2006, 18:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


sceloglauxalbifacies
****


Профиль
Группа: Экс. модератор
Сообщений: 2929
Регистрация: 16.6.2006

Репутация: 7
Всего: 158



Цитата(froggy82 @  16.10.2006,  07:28 Найти цитируемый пост)
Надо было использовать 32 разрядный регистр

это должно было быть указано в самом начале... и вообще - ты б хоть сказал(узнал) на чем вы там пишете и подо что.

Цитата(froggy82 @  16.10.2006,  07:28 Найти цитируемый пост)
и так как команда stosw некорректна, т.к. записывает значение уже на шаг вперед

если это цитата препода, то препод тот еще.
код абсолютно правильный - задачу выполняет. не очень разумно производить запись каждого элемента - это да... так было сделано для сокращения кол-ва строк кода... smile
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Asm для начинающих"
MAKCim
  • Проставьте несколько ключевых слов темы, чтобы её можно было легче найти.
  • Не забывайте пользоваться кнопкой КОД.
  • Телепатов на форуме нет! Задавайте чёткий, конкретный и полный вопрос. Указывайте полностью ошибки компилятора и компоновщика.
  • Новое сообщение должно иметь прямое отношение к разделу форума. Флуд, флейм, оффтопик запрещены.
  • Категорически запрещается обсуждение вареза, "кряков", взлома программ и т.д.

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, MAKCim.

 
 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Asm для начинающих | Следующая тема »


 




[ Время генерации скрипта: 0.0789 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.