2016-11-24 66 views
0

雖然在彙編語言程序設計研究我碰到的術語「僞操作」和「梅欽-OP」。我是不知道什麼是他們的功能和它們相互之間的區別來了?僞操作和機器操作之間的區別?

+2

機器操作系統通常是生成特定機器代碼的彙編指令。僞操作不一定會生成機器碼。通常僞操作也被稱爲彙編指令,作爲一個例子,這些都是_GCC_的指令:https://sourceware.org/binutils/docs/as/Pseudo-Ops.html#Pseudo-Ops –

回答

1

而且彙編指令,是很常見的RISC架構有僞操作將擴展爲多條指令。

最常見的類型是一個僞操作用於獲得32位常數(例如地址)到一個寄存器中需要的指令的序列。由於固定的32位指令沒有空間存儲任意32位立即數,因此機器無法在一條指令中完成。但是,用16位立即數分離這對指令通常沒有什麼好處,但手動操作會很麻煩。 (IIRC,一些超標量按順序執行時背到後面的C​​PU識別這樣的對,還在即使他們修改同一個寄存器並行運行它們。)ARM彙編僞指令MOV32ADRL做到這一點。

另一個有趣的例子是ARM的ldr r0, =0x12345678。它總是彙編爲一條指令,但可以從兩種策略中進行選擇:如果常數可以表示爲立即數(using ARM's barrel shifter),彙編器將使用MOV。如果不是,則將常量放入附近的文字池並使用PC相對負載。所以這個僞操作可以發出指令數據(我認爲仍然在同一部分)。 (LDR指令的非僞操作形式是支持ARM各種尋址模式的正常加載寄存器形式,如從r1 + r3 <<2加載的ldr r0, [r1, r3, lsl #2])。 所以相同的助記符可以是一個僞操作或機器指令根據操作數


MIPS需要僞指令到了極點,與正常ABI保留使用的32個結構寄存器中的至少一個作爲彙編程序生成的僞操作的暫時! (我想MIPS的設計者認爲32真的比需要的更多,因爲在標準的ABI中,中斷處理程序異步鎖定2個其他寄存器是正常的,這使得它們對用戶空間代碼不安全,我想這簡化了設計和。有硬件幫助更多地保存/恢復中斷的體系結構狀態,但我沒有看詳細信息。)

+1

挑剔:這'LDR 'form只會生成一條指令,在這種情況下,在一個文字池中放置一個32位常量,然後可以從該文件池索引負載。然而'MOV32'和'ADRL'可以將多條指令的常量拼湊在一起。 – doynax

+0

@doynax:hrm,我認爲LDR可以選擇不同的策略。是否它可以選擇一個MOV,如果這個常量符合一個立即的? –

+1

對,它可以選擇一個單指令立即執行的'MOV',而'ADRL'和'MOV32'則總是用兩條指令以算術方式計算地址。至少,我上次檢查IAR ARM彙編程序是什麼。 ADRL特別好奇,因爲它只支持彙編時表達式,但仍然會產生短距離的僞指令。一個盡力而爲的即時僞操作肯定會有用,但也許認爲給程序員明確的控制是安全的,對Thumb等有隨機標誌的副作用。 – doynax