2012-11-17 67 views

回答

1

是的,兩種尋址模式都是有效的。

您有這個問題標記爲Masm和Nasm。他們不一樣,你知道!爲了說服Masm,你需要一個內存引用,你可能需要做mov ds, ds:[6401h]--奇怪,我知道,但這是彙編程序的語法 - 或者說,是我最後一次使用Masm(很久以前!)。冗餘ds:在Masm中進行了優化,Nasm會發射它。如果Fasm不會這樣做,Fasm就會破裂(我懷疑它!Tomasz是一個天才!)...只是用Fasm試過了 - 工作正常!順便提一句,32位地址確實涉及一個段寄存器 - 操作系統設置好了,在「userland」代碼中使用'em'是很少見的,但它們仍然存在! (64位代碼,不 - 但我不太確定)。

+0

我也檢查過它:./FASM.EXE bar.asm 平面彙編程序版本1.70(1484627千字節存儲器) bar.asm [1]: mov ds,ds:[6401h] 錯誤:無效的操作數。 –

+1

Fasm與Nasm一樣,希望段落在括號內覆蓋。嘗試'mov ds,[ds:6401h]'(ds:'是多餘的 - 就像Masm,但與Nasm不同,Fasm將其刪除)。 –

+0

我不'似乎得到它... objdump -Mi8086解碼此爲'mov 0x6401,%ds',這是不受支持的。 –

0

多德 - 甚至沒有人使用DS註冊本世紀:)!

我強烈建議您學習32位彙編器。如果你有機會到Linux,這是一個很好的資源:

要回答你的問題 - 我相信 「否」。您通常從AX寄存器加載DS(儘管您當然可以使用其他三個通用寄存器中的任何一個)。要絕對確定,您應該查閱英特爾參考手冊(您應該可以在Google上找到它)。

PS:

當我說「32位」,我趕緊補充說,任何你學習的X86-32直接適用於X86-64。但是,您學習的16位DOS的許多(大多數)東西是而不是適用於任何當代(讀取:虛擬內存/線性地址空間)系統。

恕我直言...

+0

請注意'FS'和'GS'仍然用於線程本地存儲和訪問內核結構等內容(請參閱'SWAPGS'指令)。 – Jester

1

是,Intel支持mov ds, reg/mem, 而不是如mov ds, imm16

驗證1) gcc -c foo.s; objdump的-d foo.o的

mov (%bx), %ds 
mov 1231(%bx), %ds 

d: 67 8e 1f    mov (%bx),%ds 
10: 67 8e 9f cf 04   mov 0x4cf(%bx),%ds 

驗證2)將麻煩,如在PE 386種轉換在gcc/Cygwin來 mov 0x7b, %reg的指令;但它也適用於任何註冊表。在80286 OTOH中,尋址模式mov [0x1111], reg

mov (123), %ds    // the target is protected mode 386 
mov (123), %bx 
15: 8e 1d 7b 00 00 00  mov 0x7b,%ds 
1b: 66 8b 1d 7b 00 00 00 mov 0x7b,%bx 

paulsm4可能是正確的問題2) - 例如, Flat Assembler能夠在8086模式下編譯mov ax,[123],它不允許mov ds,[123]

但是,如果您允許某些規則的彎曲,例如如果bx/bp/[sp]/di/si中的任何一個將爲零,則允許mov ds, [1234 + reg]

+1

實際上,您引用的參考文獻並未指定DS是否適用。我不是100%肯定的,但我不認爲它是。 – paulsm4

相關問題