我EAX
寄存器包含xxxxxx9D
值和我有以下組件的代碼:x86 ROR指令如何工作?
C0C8 14 --> ROR AL,14
對我來說,這意味着該EAX
的32個比特值的最後8位由14模8轉動逐位= 6位
0x9D = b1001 1101
將被改造成
b0111 0110 = 0x76
然而,OLL yDbg告訴我EAX = xxxxxxD9
,這意味着EAX已經按位旋轉了4位!
我在哪裏錯了?
我EAX
寄存器包含xxxxxx9D
值和我有以下組件的代碼:x86 ROR指令如何工作?
C0C8 14 --> ROR AL,14
對我來說,這意味着該EAX
的32個比特值的最後8位由14模8轉動逐位= 6位
0x9D = b1001 1101
將被改造成
b0111 0110 = 0x76
然而,OLL yDbg告訴我EAX = xxxxxxD9
,這意味着EAX已經按位旋轉了4位!
我在哪裏錯了?
您試圖將一個8位寄存器旋轉20個位置。這有點多,按8旋轉會產生相同的值。旋轉9與旋轉1相同。等等。處理器將因此旋轉20個模8 = 4個位置。
非常感謝。我的錯誤是什麼? 混淆h14 = d20與d14 ...... 是的,20模8產生4 我有時候真是個傻瓜! – 2012-04-06 19:57:52
安置自己的完整的代碼,這一點:
mov al,$9d
ror al,14
我得到76預期。
編輯如果您旋轉$ 14職位,您將得到d9。
這是十四進制的十進制數。 – 2012-04-06 19:35:57
備案:表達最佳實踐以編譯器友好的方式旋轉,避免未定義的行爲:http://stackoverflow.com/questions/776508/circular-shift-rotate-operations-in-c。該答案的代碼將使gcc和clang生成一個單一的「ror」指令。 – 2015-08-17 17:41:14