Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Низкоуровневое программирование > Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 25.05.2011, 00:42   #1
anon321
Новичок
Джуниор
 
Регистрация: 23.05.2011
Сообщений: 2
По умолчанию Сравнение элементов массива.

Добрый вечер!
Сравниваю два элемента: (указатель на a передан функцией)
mov eax, [a]
add eax, 1
xor ebx, ebx
mov ebx, [eax]
mov temp_char, ebx
add eax, 1
mov ebx, [eax]
cmp temp_char, ebx
JNE exit
mov [eax], 's'

Но в ebx почему-то кладется не сам элемент массива, а страшное многозначное число. Почему?

(Это ассемблерная вставка в си. Есть массив, нужно с помощью ассемблерной вставки в си найти одинаковые элементы и убрать заменить их всех кроме одного, скажем, на '$'. Это задача полностью. Здесь я пытался просто посмотреть работу сравнения: он должен сравнить второй и третий элементы, в случае совпадения поставить вместо третьего s. В переменной я сохранял потому, что cmp не захотел сравнивать два регистра.)

Последний раз редактировалось anon321; 25.05.2011 в 01:07.
anon321 вне форума Ответить с цитированием
Старый 25.05.2011, 02:16   #2
|{ot
Форумчанин
 
Аватар для |{ot
 
Регистрация: 09.03.2008
Сообщений: 127
По умолчанию

Код:
mov eax, [a]
Если а - указатель на массив, то верно, в еах попадет адрес массива, потому как указатель это (если не ошибаюсь) адрес, который указывает на адрес
Это зависит от того как параметр передаешь в ф-цию

Код:
add eax, 1
Поскольку в еах адрес первого элемента массива, а массив типа char(1 байт) то после этой команды eax указывает на второй элемент массива

Код:
xor ebx, ebx
Эта команда бессмысленна, поскольку следующая команда полностью задает значение еbх, это примерно тоже что и
Код:
int _ebx;
_ebx = 0;
_ebx = a[1];
Код:
mov ebx, [eax]
Вот здесь уже проблема, поскольку в ebx ложится DWORD(4 байта), которые находятся по адресу еах, то есть следующие 4 элемента массива, так как один элемент массива = 1 байт в данном случае

надо так вместо этого сделать:
Код:
mov bl, byte ptr [eax]
или
Код:
mov bl,[eax]
теперь команда
Код:
xor ebx, ebx
уже не бессмыслена, так как она обнуляет весь регистр, а
Код:
mov bl, byte ptr [eax]
заносит значение только в младший байт регистра

Эти две команды можно заменить на одну:
Код:
movzx ebx, byte ptr [eax]
означает положить в ebx один байт, все остальное обнулить


Код:
mov temp_char, ebx
add eax, 1
тут понятно, все ОК
Код:
mov ebx, [eax]
Тут так само как сверху написал!

Код:
cmp temp_char, ebx
JNE exit
тут все ОК

Код:
mov [eax], 's'
здесь опять же, лучше укажи размерность явно
Код:
mov byte ptr [eax], 's'
И вот еще, зачем тебе temp_char ?
можно так:
Код:
mov eax, [a]
inc eax //add eax,1, только быстрее
mov bl, byte ptr [eax]
inc eax
cmp bl, byte ptr [eax]
JNE exit
mov byte ptr [eax], 's'
или еще короче:
Код:
mov eax, [a]
mov bl, byte ptr [eax+1]
cmp bl, byte ptr [eax+2]
JNE exit
mov byte ptr [eax+2], 's'
или еще короче и быстрее:
Код:
mov eax, [a]
mov bx, word ptr [eax+1] // ложу в bx второй и третий элементы сразу
cmp bh,bl
JNE exit
mov byte ptr [eax+2], 's'

Последний раз редактировалось |{ot; 25.05.2011 в 02:20.
|{ot вне форума Ответить с цитированием
Старый 25.05.2011, 02:16   #3
Son Of Pain
Участник клуба
 
Регистрация: 23.12.2010
Сообщений: 1,129
По умолчанию

"Страшное число" берется, видимо, потому, что массив состоит из однобайтовых элементов, а регистры eax и ebx - 32-битные (четырехбайтовые). Потому, соответственно, в них загружалось 4 элемента массива, а не один.

Должно быть так:
Код:
mov eax, [a]
add eax, 1
mov bl, [eax]
mov temp_char, bl
add eax, 1
mov bl, [eax]
cmp temp_char, bl
JNE exit
mov [eax], 's'
Вместо "add eax, 1", кстати, лучше писать просто "inc eax".
Son Of Pain вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Вывод элементов массива.Изменение элементов массива. Vesnushka18 Помощь студентам 6 09.06.2011 13:05
Записать в массив Z подряд семь нулевых элементов массива R,состоящего из N элементов.(Язык QBasic) Лиза) Помощь студентам 0 11.01.2011 16:02
Сумма и произведение элементов массива, удовлетворяющих условию (генерация float массива) felodese Помощь студентам 1 11.11.2010 20:52
найти среднее арифметическое элементов массива состоящее из 5 элементов viatlon Общие вопросы C/C++ 9 12.12.2009 00:45
В одномерном массиве, состоящем из n вещественных элементов, вычислить сумму элементов массива HazelHen Общие вопросы C/C++ 2 29.03.2009 15:16