對于 8086,可以覆寫源索引 SI 的段,以便使用 ES 而不是 DS。在一本書(舊的 Scanlon)中,我發現了這個 MASM 代碼:
LEA SI,ES:HERE
LEA DI,ES:THERE
MOVSB
由于 LEA 只檢索記憶體地址的偏移量(8086 為 16 位),MOVSB 如何知道 SI 指的是 ES 段而不是 DS 段?LEA 是否正在更改 SI 的默認分段?在我找到的許多頁面和手冊中,我沒有讀過任何關于此的內容。
uj5u.com熱心網友回復:
那個代碼看起來不對。如果沒有段覆寫前綴,movsb將始終使用DS:SI和ES:DI。除非您必須擔心古代處理器的勘誤表,否則您可以通過將段覆寫前綴賦予movsb. es:MOVSB會告訴它使用ES:SI而不是DS:SI. movsb總是復制到ES:DI; 沒有段覆寫前綴會改變它。
如果保證 DS 在此位置等于 ES,則代碼實際上可能是正確的。舊的匯編器有自己的想法,有時必須使用有趣的段覆寫來讓匯編器滿意。
uj5u.com熱心網友回復:
我在 DOSBOX 中安裝了 MASM6.11 并做了一些實驗。這是資料段的記憶體映射:
0000 dseg segment para public 'data'
0000 41 42 43 44 src db 'ABCD'
0004 dseg ends
0000 eseg segment para public 'data'
0000 5A 5A 5A 5A dummy db 'ZZZZ'
0004 31 32 33 34 dst db '1234'
0008 eseg ends
0000 cseg segment para public 'code'
assume cs:cseg, ds:dseg, es:eseg
結果是代碼:
LEA SI,ES:HERE
LEA DI,ES:THERE
MOVSB
是錯誤的:根本不考慮段,它在任何情況下都從 DS 復制到 ES(OP-CODE 是 A4):
8D 36 0000 R
8D 3E 0004 R
A4
為了實作從 ES 到 ES 的復制,您撰寫:
LEA SI,ES:HERE
LEA DI,ES:THERE
MOVS ES:THERE, ES:HERE
翻譯為:
8D 36 0000 R
8D 3E 0004 R
26: A4
我在答案中讀到的語法ES MOVSB和ES:MOVSB不適用于 MASM 6.11(但它們實際上對應于它被翻譯成的內容:26 是 ES 的代碼)。
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/411265.html
標籤:
