我們是否可以使用程序集(x86)語言中的MOV指令,以這些方式將內存操作數移動到段寄存器?將內存操作數移動到段寄存器,程序集(x86)
1.
MOV DS,[BX]
2.
MOV DS,[6401H]
我們是否可以使用程序集(x86)語言中的MOV指令,以這些方式將內存操作數移動到段寄存器?將內存操作數移動到段寄存器,程序集(x86)
1.
MOV DS,[BX]
2.
MOV DS,[6401H]
是的,兩種尋址模式都是有效的。
您有這個問題標記爲Masm和Nasm。他們不一樣,你知道!爲了說服Masm,你需要一個內存引用,你可能需要做mov ds, ds:[6401h]
--奇怪,我知道,但這是彙編程序的語法 - 或者說,是我最後一次使用Masm(很久以前!)。冗餘ds:
在Masm中進行了優化,Nasm會發射它。如果Fasm不會這樣做,Fasm就會破裂(我懷疑它!Tomasz是一個天才!)...只是用Fasm試過了 - 工作正常!順便提一句,32位地址確實涉及一個段寄存器 - 操作系統設置好了,在「userland」代碼中使用'em'是很少見的,但它們仍然存在! (64位代碼,不 - 但我不太確定)。
多德 - 甚至沒有人使用DS註冊本世紀:)!
我強烈建議您學習32位彙編器。如果你有機會到Linux,這是一個很好的資源:
要回答你的問題 - 我相信 「否」。您通常從AX寄存器加載DS(儘管您當然可以使用其他三個通用寄存器中的任何一個)。要絕對確定,您應該查閱英特爾參考手冊(您應該可以在Google上找到它)。
PS:
當我說「32位」,我趕緊補充說,任何你學習的X86-32直接適用於X86-64。但是,您學習的16位DOS的許多(大多數)東西是而不是適用於任何當代(讀取:虛擬內存/線性地址空間)系統。
恕我直言...
請注意'FS'和'GS'仍然用於線程本地存儲和訪問內核結構等內容(請參閱'SWAPGS'指令)。 – Jester
是,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]
。
實際上,您引用的參考文獻並未指定DS是否適用。我不是100%肯定的,但我不認爲它是。 – paulsm4
我也檢查過它:./FASM.EXE bar.asm 平面彙編程序版本1.70(1484627千字節存儲器) bar.asm [1]: mov ds,ds:[6401h] 錯誤:無效的操作數。 –
Fasm與Nasm一樣,希望段落在括號內覆蓋。嘗試'mov ds,[ds:6401h]'(ds:'是多餘的 - 就像Masm,但與Nasm不同,Fasm將其刪除)。 –
我不'似乎得到它... objdump -Mi8086解碼此爲'mov 0x6401,%ds',這是不受支持的。 –