BG Development


Страници: (3) [1] 2 3   ( Първото ново мнение ) Reply to this topicStart new topicStart Poll

> Асемблер задача с масиви, програма на асемблер ,работа с масиви
ivoovi
Публикувано на: 23-04-2018, 16:14
Quote Post



Име:
Група: Потребител
Ранг: Новопостъпил

Мнения: 4
Регистриран на: 14.12.16



1 .Да се напише подпрограма,която да връща в регистър R0 броя на байтовете в масив с начален адрес и брой байтове съответно в регистри R0 и R1,със стойност, равна на байта в регистър R2



2.Да се напише подпрограма,която да връща в регистър R0 броя на байтовете в масив с начален адрес и брой байтове съответно в регистри R0 и R1 ,които имат най-старши бит единица


Може ли някой да удари малко рамо?
PM
Top
kierenski
Публикувано на: 23-04-2018, 16:32
Quote Post



Име:
Група: Потребител
Ранг: Активен

Мнения: 279
Регистриран на: 10.01.16



Асемблер за кой процесор?
PMEmail Poster
Top
ivoovi
Публикувано на: 23-04-2018, 16:37
Quote Post



Име:
Група: Потребител
Ранг: Новопостъпил

Мнения: 4
Регистриран на: 14.12.16



АРМ
PM
Top
kierenski
Публикувано на: 23-04-2018, 17:39
Quote Post



Име:
Група: Потребител
Ранг: Активен

Мнения: 279
Регистриран на: 10.01.16



QUOTE (ivoovi @ 23-04-2018, 16:14)
1 .Да се напише подпрограма,която да връща в регистър R0 броя на байтовете в масив с начален адрес и брой байтове съответно в регистри  R0 и R1,със стойност, равна на байта в регистър R2



2.Да се напише подпрограма,която да връща в регистър R0 броя на байтовете в масив с начален адрес и брой байтове съответно в регистри  R0 и R1 ,които имат най-старши бит единица


Може ли някой да удари малко рамо?

За АРМ инструкции трудно ще намериш тука някой, но като алгоритъм би трябвало да се доближи близо за някакво начало.

и ето какво трябва да направиш
R0=0x100; стартов адрес
R1=0x10; брой байтове
R2=0x17; байт за тестване
R3=0x0; временна стойност

R1=R1+R0;
loop:
AND mem[R1],R2
(скок ако Z флага=1) next;
R3=R3+1;
next:R1=R1-1;
AND R1,R0
(скок ако Z флага=1) loop;
R0=R3;

Това е първата точка а другата е подобно решение просто имаш един допълнителен филтър преди AND R1,R0 за най старшия бит;
Ако има нещо криво другите да помагат.

Това мнение е било редактирано от kierenski на 23-04-2018, 17:43
PMEmail Poster
Top
ivoovi
Публикувано на: 23-04-2018, 18:05
Quote Post



Име:
Група: Потребител
Ранг: Новопостъпил

Мнения: 4
Регистриран на: 14.12.16



QUOTE (kierenski @ 23-04-2018, 17:39)
QUOTE (ivoovi @ 23-04-2018, 16:14)
1 .Да се напише подпрограма,която да връща в регистър R0 броя на байтовете в масив с начален адрес и брой байтове съответно в регистри  R0 и R1,със стойност, равна на байта в регистър R2



2.Да се напише подпрограма,която да връща в регистър R0 броя на байтовете в масив с начален адрес и брой байтове съответно в регистри  R0 и R1 ,които имат най-старши бит единица


Може ли някой да удари малко рамо?

За АРМ инструкции трудно ще намериш тука някой, но като алгоритъм би трябвало да се доближи близо за някакво начало.

и ето какво трябва да направиш
R0=0x100; стартов адрес
R1=0x10; брой байтове
R2=0x17; байт за тестване
R3=0x0; временна стойност

R1=R1+R0;
loop:
AND mem[R1],R2
(скок ако Z флага=1) next;
R3=R3+1;
next:R1=R1-1;
AND R1,R0
(скок ако Z флага=1) loop;
R0=R3;

Това е първата точка а другата е подобно решение просто имаш един допълнителен филтър преди AND R1,R0 за най старшия бит;
Ако има нещо криво другите да помагат.

Благодаря ви за помощта icon_smile.gif
PM
Top
relax4o
Публикувано на: 23-04-2018, 18:13
Quote Post



Име:
Група: Потребител
Ранг: Почетен член

Мнения: 2079
Регистриран на: 04.04.07



Само @johnfound да се появи. Така ще се зарадва, че някой пита за Асемблер icon_lol.gif


--------------------
Бисери :D

QUOTE (oveRLuckEd)
Ползваш някоя нова версия на PHP, която е вече ооп ориентирана и заради това ти я изкарва тази грешка.


QUOTE (nbacool2)
Щом няма input полета, значи няма откъде да се направи SQL инжекция Very Happy
PM
Top
Gamma Goblin
Публикувано на: 23-04-2018, 18:17
Quote Post



Име:
Група: Потребител
Ранг: Почетен член

Мнения: 1236
Регистриран на: 21.02.18



Аз отново ще предложа инженерния подход -> напиши си го на Ц и си вземи асемблера и го барни малко да не прилича на изгенериран от компилатор: https://godbolt.org/ Имам чувството че днешното поколение толкова е закърняло че даже не знае как да преписва icon_sad.gif А едно време цялата компютърна технология сме били откраднали!!!


--------------------
Напред! Живота е сраженье! Напред! И прав всегда ходи!
Напред, макар към поражение! Ако ще паднеш, прав падни!
---
Raw, and untamed in spirit, We chew this world and Spit it out
---
Challenge my own world to chaos
---
Im not intimidated by the good looking ones, it's the ugly ones that scare the shit out of me
PMEmail PosterUsers Website
Top
relax4o
Публикувано на: 23-04-2018, 18:34
Quote Post



Име:
Група: Потребител
Ранг: Почетен член

Мнения: 2079
Регистриран на: 04.04.07



QUOTE (Gamma Goblin @ 23-04-2018, 18:17)
Аз отново ще предложа инженерния подход -> напиши си го на Ц и си вземи асемблера и го барни малко да не прилича на изгенериран от компилатор: https://godbolt.org/ Имам чувството че днешното поколение толкова е закърняло че даже не знае как да преписва icon_sad.gif А едно време цялата компютърна технология сме били откраднали!!!

Там е работата, че унито те учат първо на Асемблер, а после на C. icon_lol.gif Човека, не мисля, че има някакъв опит със C(съжалявам, ако греша).


--------------------
Бисери :D

QUOTE (oveRLuckEd)
Ползваш някоя нова версия на PHP, която е вече ооп ориентирана и заради това ти я изкарва тази грешка.


QUOTE (nbacool2)
Щом няма input полета, значи няма откъде да се направи SQL инжекция Very Happy
PM
Top
AK-85
Публикувано на: 23-04-2018, 23:20
Quote Post



Име:
Група: Потребител
Ранг: Старо куче

Мнения: 775
Регистриран на: 06.07.06



QUOTE (kierenski @ 23-04-2018, 16:39)
... като алгоритъм би трябвало да се доближи близо за някакво начало.

Криво си го описал алгоритъма: Първо, чете се извън масива (един елемент след последния), а първият елемент се пренебрегва. Второ, с AND и проверка на Z флага няма как да сравняваш числа, независимо от процесорната архитектура (вземи 2 и 3 за пример), но за равенство можеш да използваш XOR. Трето, но това е лично предпочитание - аз не харесвам четене отзад напред (като поведение на кешовете), въпреки че в случая е линейно и prefetcher-ът на процесора трябва да се справи.

За решението е необходимо условно инкрементиране при равенство, което на ARM се прави с CMP + ADDEQ (или CMP + IT + ADDEQ в режим "Thumb"). Второто подусловие се прави с LSRS + ADDNE (по същия начин за "Thumb").

А задачата си плаче за паралелизация (ако масивът е достатъчно голям), като има варианти - може да е SWAR ("SIMD within a register"), може и да е SIMD.

QUOTE (relax4o @ 23-04-2018, 17:13)
Само @johnfound да се появи.

Като знам ориентацията му към x86, аз също чакам icon_smile.gif.

П.П. Сега като се замисля, за второто подусловие вариант е и CMP + ADDCS, при което се избягва едно писане в регистър, което може да улесни живота на out-of-order процесор.

Това мнение е било редактирано от AK-85 на 23-04-2018, 23:32
PM
Top
kierenski
Публикувано на: 24-04-2018, 08:38
Quote Post



Име:
Група: Потребител
Ранг: Активен

Мнения: 279
Регистриран на: 10.01.16



@AK-85
Не съм казал че е цялостно решение, даже съм го подчертал че е някакво начало.
Може както с XOR така и с AND, зависи какво целиш, може би в случая XOR ще е по-добре.
Същото може да се реализира и с операция изваждане и проверка за нула.

Четенето извън масива е така, това лесно се оправя с едно R1=R1-1; в началото.

CMP + ADDEQ също е добър вариант, зависи от стила на програмиране, за избягване на ръчния скок при първата проверка.
PMEmail Poster
Top
1 потребители преглеждат тази тема в момента (1 гости, 0 анонимни потребители)
Потребители, преглеждащи темата в момента:

Topic Options Страници: (3) [1] 2 3  Reply to this topicStart new topicStart Poll

 


Copyright © 2003-2018 | BG Development | All Rights Reserved
RSS 2.0