我不完全理解的前兩行的意思,最後兩行的差別..LEA和幾條指令如何工作?
LDS SI,[BX]
LES DI,[BX]
LEA DI,5000h
MOV DI,5000h
我認爲,LEA負載在DI 5000H的DI和MOV加載內容5000H。我對嗎??
我不完全理解的前兩行的意思,最後兩行的差別..LEA和幾條指令如何工作?
LDS SI,[BX]
LES DI,[BX]
LEA DI,5000h
MOV DI,5000h
我認爲,LEA負載在DI 5000H的DI和MOV加載內容5000H。我對嗎??
前兩個負載的32位的內容指向bx
成ds
和si
(或es
di
和)。
第二個是相同的,因爲這些值是文字。但如果他們是:
lea di,[bx]
mov di,[bx]
那麼你的預期是正確的:前者把地址bx
到di
,後者把16位指向bx
到di
。
有關這更多信息,請參閱this question爲les
/lds
和this question爲mov
/lea
。
謝謝..有很大的幫助.. –
@WahidMasud:如果這回答了一切,不要忘記投票和/或接受。 – DocMax
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位模式下可用
什麼是「幾個」? –