Как найти максимально неповторяющийся элемент в массиве без условных переходов, используя Fast-Strings? - PullRequest
0 голосов
/ 06 апреля 2020

Я решаю онлайн-тест, который наш учитель придумал.

Задача сама по себе не слишком сложная:

EAX contains a pointer to an unknown size array of shorts terminated with 0.
Write a code that finds maximum of all elements that !does not repeat!, which goes to BX register. 
EAX and contents of the array must remain unchanged.
For example, the array:
    15,900,900,8,96,108,108,96,0
will have 15 in BX.

If an element with properties listed above, return 0;

Но проблема в наборе инструкций, который мы должны использовать:

единственные команды, которые у нас есть MOV, PUSH, POP, INC, DEC, NEG, LOOP, STD, CLD, REP* MOVS*, CMPS*, SCAS*, LODS* и STOS*!

Нет условных переходов, нет функций.

С этими инструкциями I ' m полностью потеряно.

Я попытался найти конец массива, используя

    cld
    mov edi, eax   
    mov ecx, -1           
    mov  al, 0        
    repne  scasb
    inc ecx   
    inc ecx    
    neg    ecx 

, и я думаю повторить l oop rep cmps с уменьшением длины массива, которую я нашел в предыдущем штат. Но не могу придумать решение, которое работает.

Я использую вариант Intel x86 сборки NASM, но любой подойдет.

...