UTeX Clerk У вас похоже плохо с чувством юмора, а кроме этого вы не читалиИсторию одного байта. Прочитайте там 3й и 4й абзац. Там как раз написано про отсутствие вычитания. Если бы у этой задачи не было бы красивого решения, то я бы не стал её сюда отправлять. Попробуйте сначала сделать операцию NOT. А потом подумайте о том, как можно это оптимизировать если изменить формат хранения чисел.
Учи, пока не поймёшь, не пиши сей бред!: ftp://ftp.worldofspectrum.org/pub/sinclair/books/CompleteSpectrumROMDisassemblyThe.txt ftp://ftp.worldofspectrum.org/pub/sinclair/books/SpectrumShadowROMDisassembly.doc
Black_mirror Даешь еще подобных задачек, помоему о кроме тебя на такое еще the Svin способен, но он уже поутих !
вполне возможно что разработчики чего-то не договаривают - я не верю, что собралась некая группа дебилов и собрала нахЪ никому не нужный проц. вероятность сего практически на нуле)))
UbIvItS Конечно не договаривают, когда начальство узнало что сделали разработчики, то главного архитектора сразу уволили, а другие до сих пор еще не сознались, что они не знают как нужно хранить числа чтобы эффективно выполнять вычитание В общем вычитания нет (а так же SBB и NEG), NOT и XOR тоже нет, а всяких NAND, NOR, ANDN, ORN никогда и не было. Умножения тоже нет, то есть A+B*(-1) сделать не выйдет. Но можно хранить числа так, чтобы недостающие операции можно было реализовать "эффективно" за счёт тех что есть. Неужели никто не умеет обходиться без вычитания?!!
UTeX Это обычный процессор, частично совместимый с x86, только у него отсутствует команда вычитания(и еще несколько). А так он складывает беззнаковые числа разрядностью N и формирует N разрядов суммы и флаг переноса С. Но 32х разрядные числа для решения нашей задачи не самый эффективный формат, хотя в итоге всё придётся сводить к их сложению (и к другим существующим операциям).
UTeX Все проблемы решаются и без SUB, XOR, NOT, NEG, главное хорошую структуру данных подобрать. А сложение по модулю есть - по модулю 256, 65536 или 4294967296 в зависимости от разрядности операндов 8, 16 или 32
UTeX Я уже писал, что NOT REG можно сделать за 8 команд без всяких циклов, а если изменить формат хранения чисел, то будет еще меньше. Если мы храним знак отдельно, то пусть у нас A = '+', 5 B = '-', 8 как получить С=A+B в таком же формате, то есть C='-',3 ? Хотя хранить знак отдельно это уже ощутимый прогресс, до этого почему-то ни у кого не возникало идеи представить число ввиде отличном от того что понимает процессор
ну если без циклов и формат менять, то можно извратиться и операции проводить в 1-ричном формате. Те через 32-х битную переменную содержащую беззнаковые числа от 0 до 31. (при переполнениях - нулится) sub ecx,ebx == mov eax,1 shl eax,cl mov cl,bl shr eax,cl bsf ecx,eax jnz short @f mov ecx,0 @@: not ecx ; один из вариантов == mov eax,80000000h shr eax,cl bsf ecx,eax jnz short @f mov ecx,0 @@: neg ecx == not ecx inc ecx пока все.