lea是微機8086/8088系列的一條指令,取自英語load effective address——取有效位址,也就是取偏移位址。
指令格式如下:
lea reg16,mem
lea指令將儲存器運算元mem的4位16進製制偏移位址送到指定的暫存器。
這裡,源運算元必須是儲存器運算元,目標運算元必須是16位通用暫存器。
因該暫存器常用來作為位址指標,故在此最好選用四個間址暫存器bx,bp,si,di之一。
lea 取有效位址指令 (load effective address )
如:lea bx ,buffer
lea ax,[bx][di](j基址加變址定址)
lea dx,data [bx][si](相對基址加變址定址)
lea指令要求源運算元必須是儲存單元,而且目的運算元必須是乙個除段暫存器之外的16位或32位暫存器。
當目的運算元是16位通用暫存器時,那麼只裝入有效位址的低16位。
使用時要注意它與mov指令的區別,mov指令傳送的一般是源運算元中的內容而不是位址。
最近在學習組合語言,過程中遇到很多問題,對此在以後的隨筆會逐漸更新,這次談談mov,lea指令的區別
一,關於有沒有加上的問題
1,對於mov指令來說:
有沒有對於變數是無所謂的,其結果都是取值
如: num dw 2
mov bx,num
mov cx,[num];bx=cx=2
對於暫存器而言,有表示取位址,沒表示取值
如: num dw 2
mov ax,num
mov bx,ax;bx=2
mov bx,[ax];mov bx;ds:[ax],這裡可能存在報錯的情況,總之大體意思能理解就行
2,對於lea指令來說:
有沒有對於變數是無所謂的,其結果都是取變數的位址,相當於指標(與mov相反)
如:num dw 2
lea ebx,num;
lea eax,[num];ebx=eax
對於暫存器而言,有表示取值,沒表示取位址
如:mov eax,2
mov ebx,[eax];ebx=2
mov ebx,eax;eax=位址,隨程式的不同而不同
lea edi,[ebp-0c0h]
mov ecx,30h
mov eax,0cccccccch
rep stos dword ptr es:[edi]
rep指令的目的是重複其上面的指令.ecx的值是重複的次數.
stos指令的作用是將eax中的值拷貝到es:edi指向的位址.
如果設定了direction flag, 那麼edi會在該指令執行後減小,
如果沒有設定direction flag, 那麼edi的值會增加.
rep可以是任何字元傳指令(cmps, lods, movs, scas, stos)的字首.
rep能夠引發其後的字串指令被重複, 只要ecx的值不為0, 重複就會繼續.
每一次字串指令執行後, ecx的值都會減小.
stos((store into string),意思是把eax的內容拷貝到目的位址。
用法:stos dst,dst是乙個目的位址,例如:stos dword ptr es:[edi]。dword ptr字首告訴stos,一次拷貝雙字(4個位元組)的資料到目的位址。
執行stos之前必須往eax(32為暫存器)放入要拷貝的資料。上圖中,eax的內容是cccccccc,不用說都明白int3中斷。
這段**是初始化堆疊和分配區域性變數用的,往分配好的區域性變數空間放入int3中斷的原因是:防止該空間裡的東東被意外執行
參考:
linux打包指令,壓縮指令學習
compress,gzip,gcat,bzip2,bzcat 實現原理 因為檔案儲存的block性質,所以會存在儲存碎片,壓縮工具把這些沒有用的空間去除,使檔案儲存空間變小,另外一種方式是將重複的資料簡化處理 如乙個檔案在二進位制中儲存為111.111一百個1時,可以儲存為1百個1.而不是真正儲存一...
Linux指令學習
這篇部落格完全是給自己看的,一些在工作中用的指令,想到哪就寫到 或去查詢,希望自己以後能夠熟練掌握linux指令。1.使用者之間的切換指令 登入使用者 longkun,要求轉換成longquan使用者day su longqun 空格不要少 su 切換到根目錄 sudo 指令是小於root的大許可權...
Linux 指令學習
ctr alt t 開啟控制台 tab鍵檔名提示 解壓 tar.bz2 tar.gz 例 tar zxvf a.tar.gz 解壓命令使用tar 或z 解壓gz格式 或j 解壓bz2格式 或 x解壓tar格式 或 v顯示解壓資訊 或 f指向檔案 解壓檔名 壓縮檔案 tar zcvf a.tar.gz...