簡體   English   中英

打開Watcom內聯匯編SEG和OFFSET運算符

[英]Open Watcom Inline assembly SEG and OFFSET operators

今天,我了解到,默認情況下,MASM中的SEG運算符返回的是GROUP的地址,而不是所討論表達式的SEGMENT的地址,並且有一些選項和方法可以覆蓋它。

由於我當前在Open Watcom 1.9 / 16位DOS中執行一個復雜的項目,其中C和程序集(內聯和獨立)混合使用(實際上,DOS僅在啟動時才需要,然后由我自己的MINI-OS進行控制),並且由於我知道WASM在某種程度上與MASM兼容,我有以下問題:

在進行內聯匯編並獲取變量的分段時,SEG操作員是否返回變量所在的GROUP或SEGMENT?

假設有一個名為MY_GROUP的GROUP,一個屬於MY_GROUP的名為MY_SEG的SEGMENT和一個位於MY_SEG中的名為MY_VAR的變量/標簽。

那我做的話

_asm {
MOV AX, SEG MY_VAR
}

哪個值加載到AX中? 是MY_GROUP的地址還是MY_SEG的地址(假設它們不同)?

我沒有發現任何與內聯匯編中的問題相關的命令行開關。 然后,我嘗試了MASM語法:

_asm {
MOV AX, SEG MY_GROUP:MY_VAR
MOV AX, SEG MY_SEG:MY_VAR
}

上面的兩行均導致以下錯誤:“僅允許段或組標簽”。

請注意,我的問題僅與內聯匯編有關。 實際上,我將JWASM用於獨立的程序集模塊,並且上面的語法運行良好,並且在那里具有預期的結果。

誰能告訴我在這種情況下內聯匯編程序的工作,是否有辦法控制我各自的行為?

非常感謝你!

我認為沒有任何方法可以說服OpenWatcom編譯器發出基於組的段重定位。 問題的部分原因是無法聲明或定義組,因此您可以在內聯程序集中引用它。

但是,OpenWatcom鏈接器似乎將忽略重定位是基於段的事實,而是使用該段所屬的組作為基礎。 因此,假設您使用的是wlink則在第一個示例中,AX將加載一個指向MY_GROUP開頭的段值。 另一方面,如果您使用Microsoft的分段鏈接器,則AX將包含指向MY_SEG的分段值。

暫無
暫無

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

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