Форум программистов, компьютерный форум, киберфорум
Assembler для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.55/11: Рейтинг темы: голосов - 11, средняя оценка - 4.55
2 / 5 / 1
Регистрация: 14.05.2013
Сообщений: 99

Перевод цикла на ассемблер

16.06.2014, 16:34. Показов 2216. Ответов 12
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Всем привет!

Помогите, пожалуйста, перевести на ассемблер следующий код С++:

Дано:
C++
1
2
3
4
5
byte* Dest;
byte* Sours;
byte* lut;
int Height;
int Width;
Код, который надо перевести:
C++
1
2
3
4
5
6
byte b;
for (int i = 0; i < Height * Width; i++)
{
  b = Sours[lut[i]]; 
  Dest[i] = b;
}
0
Лучшие ответы (1)
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
16.06.2014, 16:34
Ответы с готовыми решениями:

Создание цикла из чисел (ассемблер)
Необходимо заполнить память числами от 0 до 254, 4 раза подряд! Работаем на микропроцессоре &quot;tms 320=c5500&quot;

Перевод из C++ в ассемблер
#include &lt;stdio.h&gt; int main (void) { int a, b, c, d, max; printf (&quot;Please, enter 1 element:&quot;); scanf(&quot;%d&quot;, &amp;a); printf...

Перевод с С++ на ассемблер
Мне нужно перевести с С++ код ниже на ассемблер int sum, i,f=1; for (i =2 , sum = 0; i &lt;= (n-1); i++) { for(int...

12
4195 / 1841 / 223
Регистрация: 06.10.2010
Сообщений: 4,127
16.06.2014, 18:36
Assembler
1
2
3
4
5
6
7
8
9
mov ecx,[Height]
mul ecx,[Width]
mov esi,[lut]
mov ebx,[Sours]
mov edi,[Dest]
@@:mov  al,[esi+ecx]
   xlat
   mov  [edi+ecx],al
loop @b
1
Хочу в Исландию
 Аватар для skaa
1041 / 840 / 119
Регистрация: 10.11.2010
Сообщений: 1,630
16.06.2014, 19:15
Проверено в FASM.
Дано:
Assembler
1
2
3
4
5
6
Dest    dd ?
Sours   dd ?
lut     dd ?
Height  dd ?
Width   dd ?
b       db ?
Код:
Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
        mov     eax,[Height]
        mov     ebx,[Width]
        mul     ebx
        mov     ecx,eax
        mov     esi,[lut]
        mov     eax,0
mr:
        push    eax
 
        lodsb
        mov     ebx,[Sours]
        xlatb
        mov     [b],al
 
        mov     edi,[Dest]
        pop     eax
        add     edi,eax
        mov     bl,[b]
        mov     [edi],bl
 
        inc     eax
        loop    mr
1
2 / 5 / 1
Регистрация: 14.05.2013
Сообщений: 99
17.06.2014, 09:47  [ТС]
Большое спасибо за ответы!

Не могли бы вы перевести на asm еще два фрагмента, если не затруднит:

C++
1
2
3
4
5
short* lutSource = new short[16383];
for(int i = 0; i < 16383; i++)
{
    lutSource[i] = i;
}
И второй:
C++
1
2
3
4
5
6
short* resDest;
short* Dest;
for(int i = 0; i < FrameWidth * FrameHeight; i++)
{
  resDest[i] = Dest[i];
}
Добавлено через 14 минут
В первом коде тоже поправочка.

Дано (изменены 2,3 строки):

C++
1
2
3
4
5
byte* Dest;
short* Sours;
short* lut;
int Height;
int Width
;

Код (изменена 4 строка):

C++
1
2
3
4
5
6
byte b;
for (int i = 0; i < Height * Width; i++)
{
  b = lut[Sours[i]];
  Dest[i] = b;
}
0
4195 / 1841 / 223
Регистрация: 06.10.2010
Сообщений: 4,127
17.06.2014, 11:10
C
1
2
3
4
5
6
short* resDest;
short* Dest;
for(int i = 0; i < FrameWidth * FrameHeight; i++)
{
  resDest[i] = Dest[i];
}
Assembler
1
2
3
4
5
mov  ecx,[FrameWidth]
imul ecx,[FrameHeight]
mov  esi,[Dest]
mov  edi,[resDest]
rep  movsw
Добавлено через 3 минуты
C
1
2
3
4
5
short* lutSource = new short[16383];
for(int i = 0; i < 16383; i++)
{
    lutSource[i] = i;
}
Без new
Assembler
1
2
3
4
5
mov ecx,16383
mov eax,[lutSource]
@@:mov [eax+ecx],cx
loop @b
mov [eax],cx
1
2 / 5 / 1
Регистрация: 14.05.2013
Сообщений: 99
17.06.2014, 11:57  [ТС]
Цитата Сообщение от murderer Посмотреть сообщение
Код ASM
mov ecx,[Height]
mul ecx,[Width]
mov esi,[lut]
mov ebx,[Sours]
mov edi,[Dest]
@@:mov *al,[esi+ecx]
* *xlat
* *mov *[edi+ecx],al
loop @b
Ошибка в строке:
Assembler
1
mul ecx,[Width]
[bcc32 Error]E2329 Invalid combination of opcode and operands
К тому же что поменяется в коде, если Sourc и lut не byte, а short?
0
4195 / 1841 / 223
Регистрация: 06.10.2010
Сообщений: 4,127
17.06.2014, 12:16
Вместо mul напиши imul.
0
2 / 5 / 1
Регистрация: 14.05.2013
Сообщений: 99
17.06.2014, 13:08  [ТС]
Цитата Сообщение от murderer Посмотреть сообщение
Вместо mul напиши imul.
Новая ошибка:
E2516 LOOP/JCXZ distance out of range
Я чего-то не понимаю, видимо, но где условие выхода из цикла?
0
4195 / 1841 / 223
Регистрация: 06.10.2010
Сообщений: 4,127
17.06.2014, 13:24
Наверное компилятор не понимает, что такое ""@@:" - замени на "@b:".
1
2 / 5 / 1
Регистрация: 14.05.2013
Сообщений: 99
18.06.2014, 08:51  [ТС]
Цитата Сообщение от murderer Посмотреть сообщение
Наверное компилятор не понимает, что такое ""@@:" - замени на "@b:".
На первой же итерации возникает исключение на строчке
Assembler
1
mov  [edi+ecx],al;
First chance exception at $004544FA. Exception class $C0000005 with message 'access violation at 0x004544fa: write of address 0x0b95ffff'. Process AAA.exe (4708)
Еще раз напишу, Вы не заметили, наверное. Изменились условия: Sourc и lut не byte, а short

Добавлено через 18 часов 40 минут
Цитата Сообщение от skaa Посмотреть сообщение
Проверено в FASM.
Дано:
Assembler
1
2
3
4
5
6
Dest    dd ?
Sours   dd ?
lut     dd ?
Height  dd ?
Width   dd ?
b       db ?
Код:

Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
mov     eax,[Height]
        mov     ebx,[Width]
        mul     ebx
        mov     ecx,eax
        mov     esi,[lut]
        mov     eax,0
mr:
        push    eax
 
        lodsb
        mov     ebx,[Sours]
        xlatb
        mov     [b],al
 
        mov     edi,[Dest]
        pop     eax
        add     edi,eax
        mov     bl,[b]
        mov     [edi],bl
 
        inc     eax
        loop    mr
Сделайте, пожалуйста, поправки, с учетом того, что Sours и lut не byte, a short.

В этом виде, возникает исключение:
First chance exception at $0045444F. Exception class $C0000005 with message 'access violation at 0x0045444f: write of address 0x0c300000'. Process AAA.exe (4364)
на строке:
Assembler
1
mov     [edi],bl
0
4195 / 1841 / 223
Регистрация: 06.10.2010
Сообщений: 4,127
18.06.2014, 10:25
Assembler
1
2
3
4
5
6
7
8
9
10
11
12
pushad
mov  ecx,[Height]
imul ecx,[Width]
mov  esi,[lut]
mov  ebx,[Sours]
mov  edi,[Dest]
xor  eax,eax
@b:lodsw
   mov ax,[ebx+eax*2]
   stosw
loop @b
popad
Переменные должны быть объявлены так:
Assembler
1
2
3
short *lut;
short *Sours;
short *Dest;
Перед вызовом ассемблерного кода этим переменным нужно выделить память. Массив lut должен содержать вменяемые значения (меньшие чем размер Sours).
1
2 / 5 / 1
Регистрация: 14.05.2013
Сообщений: 99
18.06.2014, 10:33  [ТС]
Оказалось, что время работы алгоритма без asm 10 - 20 мс. (перевод на asm имел смысл для экономии времени) Выходит смысла переводить в asm нет. Спасибо всем отписавшимся! Тема закрыта.
0
4195 / 1841 / 223
Регистрация: 06.10.2010
Сообщений: 4,127
18.06.2014, 10:46
Лучший ответ Сообщение было отмечено doomkin как решение

Решение

Так бы сразу и сказал, что оптимизация по скорости нужна - я бы не стал предлагать медленные инструкции loop, lodsw, stosw, xlat. А вообще такие простые вещи любой компилятор сам прекрасно умеет оптимизировать, переписывать на ассемблер действительно нет смысла.
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
18.06.2014, 10:46
Помогаю со студенческими работами здесь

Перевод кода с C на Ассемблер
Не судите строго, я только начал изучать ассамблер! #include &lt;stdio.h&gt; #include &lt;stdlib.h&gt; #include &lt;malloc.h&gt; void main() ...

перевод паскаля в ассемблер. очень нужен
Пожалуйста, помогите перевести программу из паскаля в ассемблер! uses crt; var i,n0,n1,ic,a,b,c,k1: integer; m:array of string; ...

Перевод числа в строку (встроенный ассемблер в FreePascal)
Ассемблер интегрированный в Lazarus. Дано однобайтное число со знаком. Написать подпрограмму на языке ассемблер, для перевода числа в...

Перевод числа из OCT в BIN систему счисления ассемблер
Доброго времени суток! Стоит задача перевести число из 8 в 2 систему счисления на ассемблере. При запуске программы вводим число в 8...

Перевод кода С++ на ассемблер
Привет. Объясните пожалуйста как код С++ преобразовать в код ассемблера? Слышал что можно через Olly, только не пойму как(если конечно...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
13
Ответ Создать тему
Новые блоги и статьи
Подстановка значения реквизита справочника в табличную часть документа
Maks 10.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеПерсонала", разработанного в конфигурации КА2. Задача: при выборе сотрудника (справочник Сотрудники) в ТЧ документа. . .
Очистка реквизитов документа при копировании
Maks 09.04.2026
Алгоритм из решения ниже применим как для типовых, так и для нетиповых документов на самых различных конфигурациях. Задача: при копировании документа очищать определенные реквизиты и табличную. . .
модель ЗдравоСохранения 8. Подготовка к разному выполнению заданий
anaschu 08.04.2026
https:/ / github. com/ shumilovas/ med2. git main ветка * содержимое блока дэлэй из старой модели теперь внутри зайца новой модели 8ATzM_2aurI
Блокировка документа от изменений, если он открыт у другого пользователя
Maks 08.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа, разработанного в конфигурации КА2. Задача: запретить редактирование документа, если он открыт у другого пользователя. / / . . .
Система безопасности+живучести для сервера-слоя интернета (сети). Двойная привязка.
Hrethgir 08.04.2026
Далее были размышления о системе безопасности. Сообщения с наклонным текстом - мои. А как нам будет можно проверить, что ссылка наша, а не подделана хулиганами, которая выбросит на другую ветку и. . .
Модель ЗдрввоСохранения 7: больше работников, больше ресурсов.
anaschu 08.04.2026
работников и заданий может быть сколько угодно, но настроено всё так, что используется пока что только 20% kYBz3eJf3jQ
Дальние перспективы сервера - слоя сети с космологическим дизайном интефейса карты и логики.
Hrethgir 07.04.2026
Дальнейшее ближайшее планирование вывело к размышлениям над дальними перспективами. И вот тут может быть даже будут нужны оценки специалистов, так как в дальних перспективах всё может очень сильно. . .
Горе от ума
kumehtar 07.04.2026
Эта мне ментальная установка, что вот прямо сейчас, мол, мне для полного счастья не хватает (нужное вписать), и когда я этого достигну - тогда и полный кайф. Одна из самых сильных ловушек на пути. . . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru