13. MOV is Turing-complete

No, mov is not Turing-complete. There must be

  • either an additional jmp instruction
  • or separate data and program memory, where program memory is
    • finite with wrap-around,
    • or infinite.

See also rebuttal on reddit mov is Turing-complete by Stephen Dolan: ReverseEngineering.

  1. Eine Turing-Maschine mit ausschließlich mov-Instruktion ist nicht realisierbar.

    Das großspurig angekündigte mov is Turing-complete - Cambridge Computer Laboratory (Dokument ist nicht mehr verfügbar. Lokaler Link) bringt nicht neues und auf Seite 4 wird die Katze dann aus dem Sack gelassen. Es braucht einen jmp Befehl:

    … in a suitable state to run the program again, so we use our single unconditional jump to loop back to the start:

    jmp start
    

    This simulates an arbitrary Turing machine, using only mov (and a single jmp to loop the program).

  2. Es gibt auch keinen C-Compiler, der nur mit mov geschrieben ist (obwohl man das natürlich realisieren kann, wenn man sehr viel Speicher übrig hat).

    Es gibt eine LCC-Erweiterung M/o/Vfuscator2 die ein C-Programm in mov-Instruktionen übersetzt. Dieses Programm selbst ist aber in C geschrieben.

    Und der Autor redet sich ebenfalls die Welt schön. Im Abschnitt Notes:

    While Dolan’s paper required a jmp instruction, the M/o/Vfuscator does not - it uses a faulting mov instruction to achieve the infinite execution loop.

    If you’re worried that this is still “jumping”, the same effect could be achieved through

    1. pages aliased to the same address,
    2. wrapping execution around the upper range of memory,
    3. ring 0 exception handling,
    4. or simply repeating the mov loop indefinitely.

    Die Punkte a) - c) sind alles mehr oder weniger verdeckte Sprünge!

    Wobei Punkt a) wenigstens noch als Endlosband denkbar ist. Das sollte man aber auch klar und deutlich spezifizieren. Auf jeden Fall ist es dann Essig mit gemeinsamem Programm- und Datenspeicher. Die müssen dann auf jeden Fall getrennt sein. Und damit braucht es eine nichtexistente (aber realisierbare) CPU.

    Punkt d) ist illusorischer Quatsch. In diesem Fall haben wir eine CPU mit getrenntem Programmspeicher und Datenspeicher, wobei der Programmspeicher unendlich groß ist. Also nichts realisierbares, weil es keine finiten Register geben kann, die eine unendlich große Adresse speichern könnten. Mit einem \(\aleph_0\) basierten Zahlensystem bräuchte so ein Register allerdings nur ein A-Bit. Dagegen wären wohl Q-Bits bloß ein schwacher Abklatsch.

  3. Wenn man also sowieso einen jmp braucht, dann kann man auch gleich einen bedingten Sprung nehmen und hat damit im Wesentlichen genau das existierende und realisierte Konzept einer von-Neumann-Maschine. Die zusätzlichen arithmetischen, logischen und Schiebeoperationen sind dann halt einfach sinnvoller Luxus.

Das ganze ist also ein reichlich sinnloses Unterfangen, das nicht mal intellektuell anspruchsvoll ist, weil es mit Desinformation arbeitet. Irgenwelche Schlußfolgerungen daraus zu ziehen ist hanebüchen ;-) Brainfuck und Malbolge sind wenigstens amüsant und nicht so prätentiös.