Я решаю онлайн-тест, который наш учитель придумал.
Задача сама по себе не слишком сложная:
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, но любой подойдет.