簡體   English   中英

為什么mov圖靈完整?

[英]Why is mov turing complete?

我最近發現了這個: https://github.com/xoreaxeaxeax/movfuscator
這似乎取決於mov是圖靈完備的事實。 這是真的嗎,為什么?

是的,x86 的mov是圖靈完備的。 我在您的問題中添加了該標簽,因為它可能不適用於帶有名為mov指令的其他 ISA,並且 movfuscator 編譯器僅針對 x86。

進行計算的不是“mov”本身,而是可以進行加法(和位移)的 x86 尋址模式 我沒有詳細研究它是如何工作的,但它在很大程度上依賴於查找表,以及諸如mov eax, [base + eax*4]加載兩個可能值之一,具體取決於 EAX 為 0 或 1。

Also remember that x86 mov has several forms : between memory and register (load, store, or reg<-reg), or immediate to memory or register. 並具有包括絕對和寄存器間接尋址模式。

我不認為它依賴於自我修改代碼,但如果我錯了,請糾正我。 (如果確實如此,我認為/希望 movfuscator 至少不會創建除mov以外的指令。那將是作弊。)


而且,這只是真實的; 你需要一些方法來循環主程序,假設原始源不是沒有循環的直線 - Movfuscator github 自述文件談到了這個:

雖然 Dolan 的論文需要 jmp 指令,但 M/o/Vfuscator 不需要 -它使用錯誤的 mov 指令來實現無限執行循環 如果您擔心這仍然是“跳躍”,則可以通過別名為相同地址的頁面來實現相同的效果,圍繞 memory 的上限執行執行,環 0 異常處理,或者只是無限期地重復 mov 循環。 jmp 當前用於調度外部函數 - 如果這是一個問題,請避免使用外部函數,或者也使用 M/o/Vfuscator 編譯庫。

在為僅 mov 代碼運行創建用戶空間環境時,我假設它創建了一個 SIGSEGV 處理程序(在 POSIX 操作系統上),該處理程序從頂部重新開始執行。 因此任何故障負載都可以重新啟動主循環。

還提到了讓執行環繞的可能性:

Wraparound of IP can work well in 16-bit mode where IP is 16-bit but CS:IP form a 20-bit linear address (real mode) or in 16-bit protected mode a 64k window somewhere in linear address space. 即,您只能在部分地址空間中擁有 64k 的指令塊,而其他空間則留給數據。 DS 段可以使用不同的基數。 (16 位模式下的 32 位尋址模式是可能的,因此您仍然擁有任何寄存器和縮放索引尋址模式的全部功能。)請注意,用於讀取和寫入段寄存器的助記符也是mov

但在 EIP 為 32 位的 32 位模式下更難,在 seg+off 計算后線性地址也是如此。 除非有其他技巧,否則回繞只能發生在整個地址空間中,而不管您對分段做什么。 這不會為數據留下非代碼空間。 設置較低的段限制可能會導致代碼提取錯誤,但這不會導致回繞(除非您設置信號處理程序,或者在裸機上設置中斷處理程序地址)。

無論哪種方式,即使 x86-64 也只有 64 位指針(理論上;實際上是 48 位或 57 位),所以空間是有限的,這與具有無限磁帶的真正圖靈機不同。

通過直接證明其所有圖靈可計算功能的能力,系統很少被稱為圖靈完備。 相反,它們通常被“類比”為已知為圖靈完備的現有系統。

Stephen Dolan 的論文表明mov是 TC,通過根據mov構建一個 TM 系統的模擬來做到這一點。 因此,可以向 TC 系統提出的任何問題,在最壞的情況下,都可以在mov構造的模擬中虛擬化。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM