簡體   English   中英

Visual C ++內聯匯編程序的兩個偏移量之差

[英]Visual-C++ inline assembler difference of two offsets

我正在將代碼塊從MASM移植到C內聯匯編程序(x86,Windows,MS VC)。Foolowing並不是真正的代碼,只是出於欺騙的目的。 假設我有一些數據定義為靜態數組,甚至是兩個標簽之間的代碼塊,我需要獲取它的大小。

    label1:
    bla bla bla
    label2:
    ....
    mov eax, (offset label2 - offset label1)

這樣的代碼可以在MASM中像超級按鈕一樣工作,但是在CI中會收到以下錯誤消息:“錯誤C2425:'-':'第二個操作數'中的非恆定表達式”我可以進行編譯:

    mov eax, offset label1
    mov eax, offset label2

我希望編譯器在編譯時進行評估(偏移標簽1-偏移標簽2),但是看起來我錯了。 我也不能添加偏移量(為什么?這只是在編譯過程中添加的兩個整數...?)當然,我可以得到mov eax,offset label2 mov edx,offset label1 sub eax,edx編譯,但這是一個額外的代碼僅用於計算常數。 有人可以解釋一下,我的代碼有什么問題嗎?

可能是由於搬遷引起的嗎? 如何推動?

期待得到答案,謝謝。

真正的匯編程序可能要經過幾遍代碼才能獲得所有標簽的固定地址。 例如,某些跳躍的形式有長有短,具體取決於您想跳多遠。 如果標簽之間有這樣的跳轉,則距離取決於跳轉的位置。

C編譯器可能會將其中的一部分留給鏈接器/加載器,並且在編譯時沒有固定值。

您很可能將addres計算代碼簡化為兩條指令

mov EAX, offset Label2
sub EAX, offset Label1

我認為這不會完全破壞代碼的性能。

是的,它可能是由於重定位的威脅,也可能是涉及相對跳轉的變長指令的威脅。 匯編程序編寫者很可能是由於一些小麻煩而采取了簡單的方法,並實施了1遍或2遍編譯器,以便盡快做出最終決定。 因此,不支持某些方便的表達方式。

正如評論中已經建議的那樣,匯編器可能仍支持mov + sub組合。

暫無
暫無

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

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