我在玩x86 x86,當我試圖使用nasm轉換一些彙編指令到機器指令時,我發現了一些有趣的東西。相同的彙編指令,但不同的機器指令
mov [0x3412],al
mov [0x3412], bl
mov [0x3412], cl
mov [0x3412], dl
1 00000000 A21234 mov [0x3412], al
2 00000003 881E1234 mov [0x3412], bl
3 00000007 880E1234 mov [0x3412], cl
4 0000000B 88161234 mov [0x3412], dl
正如你所看到的,mov [0x3412], al
是規則的例外。 另外,我發現mov [0x3412], al
映射到兩個不同的機器指令。
[email protected]:~/asm$ ndisasm 123
00000000 88061234 mov [0x3412],al
00000004 A21234 mov [0x3412],al
除了這個特殊的指令,還有沒有其他的彙編指令映射到86多臺機器的指令?
你已經偶然發現了英特爾808X設計的神器。 AX是一個通用的16位寄存器,但是英特爾將AX(或AH和AL的高/低8位版本)用於某些操作。英特爾將AX註冊爲累加器。 AX(和AH,AL)對於某些指令有特殊的編碼(通常少用一個字節)。您可以選擇使用較短或較長的指令(對於有限的內存來說越短越好)。除了MOV,AX/AH/AL還爲ADC,ADD,AND,CMP,OR,SBB,SUB,TEST,XOR提供了特殊編碼。 –
@MichaelPetch:這實際上是答案,不是一個簡單的評論! – usr2564301
如果你對這些東西感興趣,你應該看看指令集的參考。 – Jester