0 / 0 / 0
Регистрация: 09.05.2018
Сообщений: 16
|
||||||
1 | ||||||
C/C++ Обращение к элементу массива (встроенный Assembler)09.05.2018, 17:58. Показов 2674. Ответов 8
Метки нет Все метки)
(
Изучаю ассемблер. В этой задаче хочу в переменную ср положить какой-то элемент массива(массив и индекс элемента передаю в функцию), но выводит неверно. Например, если index=2, то выводит -9.22596e+61, хотя второй элемент равен 44(если с нуля считать).
0
|
|
09.05.2018, 17:58 | |
Ответы с готовыми решениями:
8
Обращение к элементу массива через ASM(Assembler) Что быстрее? Обращение к элементу массива или к элементу структуры? Обращение к элементу массива Обращение к элементу массива |
1624 / 809 / 146
Регистрация: 13.06.2015
Сообщений: 3,263
|
|
09.05.2018, 21:32 | 2 |
А вот тут по-вашему что произойти должно?
Особенно учитывая, что index имеет тип double, что уже само по себе дичайшая ошибка. То же самое и с cp.
0
|
0 / 0 / 0
Регистрация: 09.05.2018
Сообщений: 16
|
|
09.05.2018, 22:03 [ТС] | 3 |
Подразумевалось, что адрес переменной index имеет размер dword.
Но, очевидно, это неверно. index - это константа, значит имеет фиксированный размер С типом double сложнее. Нужно какое-то преобразование типов?
0
|
3405 / 1824 / 489
Регистрация: 28.02.2015
Сообщений: 3,699
|
|
09.05.2018, 22:50 | 4 |
по строкам:
1)зачем, если Вы его нигде больше не используете 2)индекс массива может быть только натуральным числом(первый, второй, . . . милионный). Компилятор С, считает, что массив начинается с нуля, компилятор Pascal, неважно с чег начинается, но автоматически приведит к нулю; 2)Вы читаете в EDX, что-то, что находится по адресу [полтора]; 3)После этого в ЕАХ Вы читаете, с адреса, который равен сумме начала адреса массива и значению по адресу [полтора]; 3-4)
1
|
1624 / 809 / 146
Регистрация: 13.06.2015
Сообщений: 3,263
|
||||||
09.05.2018, 22:52 | 5 | |||||
![]() Решение
Нужно во-1 назначить индексным переменным индексный тип, во-2 у вас какой-то неизвестный науке режим адресации используется, в-3, тип double занимает 8 байт и его за 1 раз не передашь, в-4 зачем функция возвращает всегда первый элемент???
Вот так может чего понятнее станет
2
|
0 / 0 / 0
Регистрация: 09.05.2018
Сообщений: 16
|
|
10.05.2018, 08:05 [ТС] | 6 |
Здесь все понятно, кроме того, зачем movsd используется дважды?
А можно ли это сделать без использования стека?
0
|
1624 / 809 / 146
Регистрация: 13.06.2015
Сообщений: 3,263
|
||||||
10.05.2018, 14:08 | 7 | |||||
2 раза по 4 байта пересылается, нельзя за 1 раз 8 байт переслать
Это зависит от компилятора. Стек используется для сохранения состояния в целях безопасности. Если вы уберёте push/pop и у вас всё продолжит работать - значит они не нужны. Добавлено через 46 минут Индексацию, конечно, можно проще сделать. Сразу не сообразил.
1
|
0 / 0 / 0
Регистрация: 09.05.2018
Сообщений: 16
|
|
10.05.2018, 17:10 [ТС] | 8 |
Хорошо, спасибо!
А что, если я хочу в этой же программе, сравнить (cmp) значения в mas[index_1] и mas[index_2]( index_1, index_2 даются на вход) и в зависимости от результата сравнения уже дальше что-то делать. Вопрос: т.к. movsd пересылает dword из esi в edi, тогда мне нужно и mas[index_1] и mas[index_2] заносить в отдельные переменные и сравнивать? Проблема в том, что при сравнении(как я понимаю) нужно работать именно со значениями массива, а значение получаю только используя movsd
0
|
1624 / 809 / 146
Регистрация: 13.06.2015
Сообщений: 3,263
|
|
10.05.2018, 19:50 | 9 |
Это вам уже надо задействовать FPU. Судя по вашему уровню владению ассемблером, это займёт у вас месяц гденить))
0
|
10.05.2018, 19:50 | |
Помогаю со студенческими работами здесь
9
Обращение к элементу массива
Обращение к элементу массива? Обращение к элементу массива Обращение к элементу массива
Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |