2013-08-20 43 views
4

我不完全理解的前兩行的意思,最後兩行的差別..LEA和幾條指令如何工作?

LDS SI,[BX] 
LES DI,[BX] 
LEA DI,5000h 
MOV DI,5000h 

我認爲,LEA負載在DI 5000H的DI和MO​​V加載內容5000H。我對嗎??

+0

什麼是「幾個」? –

回答

4

前兩個負載的32位的內容指向bxdssi(或esdi和)。

第二個是相同的,因爲這些值是文字。但如果他們是:

lea di,[bx] 
mov di,[bx] 

那麼你的預期是正確的:前者把地址bxdi,後者把16位指向bxdi

有關這更多信息,請參閱this questionles/ldsthis questionmov/lea

+0

謝謝..有很大的幫助.. –

+1

@WahidMasud:如果這回答了一切,不要忘記投票和/或接受。 – DocMax

2

LEA實際上並沒有從內存中加載任何東西。它只設置一個最多兩個源寄存器(一個可以相乘)和一個立即值到目的寄存器的總和。例如,「lea bp,[bx * 2 + si + 3]」設置爲bp寄存器的總和,bx乘以2加上si加3. 3. LDS和LES,相反,從存儲器加載值到一對寄存器:一個段寄存器(DS或ES)和一個通用寄存器。還有其他寄存器的版本:分別用於FS,GS和SS段寄存器的LFS,LGS和LSS(在80386中引入)。因此這些指令加載了「遠」指針 - 一個由16位段選擇器和一個16位(或32位,取決於模式)偏移量組成的指針,所以總的遠指針大小爲32位,位以16位模式和48位以32位模式。

這些指令對於16位模式非常有用,無論是16位實模式還是16位保護模式。

在32位模式下,由於所有段寄存器都指向相同的位置,因此不需要這些指令,因此不需要加載段寄存器。

在64位模式下,這些指令未實現,它們的操作碼存在訪問衝突。自英特爾實施VEX--「矢量擴展 - (SSE2)以來,英特爾將它們的LDS和LES操作碼開始用於VEX前綴,結果,256位AVX(YMM)寄存器僅在64位模式下可用