| 匯編指令的一般性要求: 1、兩個操作數的尺寸必須一致; 2、操作數不能同為內存. --------------------------------------------------------------------------------------------------------------- ;mov ;該指令不影響 EFlags ;指令格式: (其中的 r、m、i 分別表示: 寄存器、內存、立即數) mov?r/m, r/m/i ? ??? mov val, 123 ??? mov? edx, val ??? mov? eax, edx ??? PrintDec edx????? ;123 --------------------------------------------------------------------------------------------------------------- Lea ;該指令不影響 EFlags ;指令格式: LEA r, m ? .data ??? szText db 'ABCDEFG', 0 .code main proc ??? lea eax, offset szText ??? lea ebx, szText ??? PrintHex eax ;00403000 ??? PrintHex ebx ;00403000 ??? ret main endp end main 讓我感到比較困惑的是?? lea 的那條居然會輸出地址? - - --------------------------------------------------------------------------------------------------------------- XCHG(Exchange): 交換指令 ?數據交換指令 XCHG ?格式: XCHG OPRD1,OPRD2 其中的OPRD1為目的操作數,OPRD2為源操作數 ?功能: 將兩個操作數相互交換位置,該指令把源操作數OPRD2與目的操數OPRD1交換. ?說明: 1. OPRD1及OPRD2可為通用寄存器或存儲器,但是兩個存儲器之間是不能用XCHG指令? ----???? 實現的. ?????? 2. 段寄存器內容不能用XCHG指令來交換. ????????? 示例: XCHG AX,BX ??????????????? XCHG SI,AX ??????????????? XCHG CL,CH ??????????????? XCHG DX,BUFFER ??????????????? XCHG CH,DATA2[SI] ??????????????? SCHG WORDA,CX ? ?????? 3. 若要實現兩個存儲器操作數DATA1及DATA2的交換,可用以下指令實現: ????????? 示例: PUSH DATA1 ??????????????????PUSH DATA2 ??????????????? ? POP DATA1 ???????????????? ?POP DATA2 ????????? 注意: 此處通過中間寄存器,也很容易實現兩個存儲器操作數的交換. ?????? 4. 本指令不影響狀態標志位. XCHG r/m, r/m --------------------------------------------------------------------------------------------------------------- XLATB(Translate Byte)、XLAT(Translate): 換碼指令 查表指令 XLAT/XLATB ? ?格式: XLAT TABLE 其中TABLE為一待查表格的首地址. ?----? XLATB TABLE 其中TABLE為一待查表格的首地址.???? ?功能: 把待查表格的一個字節內容送到AL累加器中.在執行該指令前,應將 TABLE先送至BX? ----? 寄存器中,然后將待查節節與在表格中距表首地址位移量送AL,即 (AL)<--((BX)+(AL)). ;XLATB 可簡化為 XLAT ;該指令不影響 EFlags ;XLAT 無參數, 操作和 EBX、AL 相關 ;執行 XLAT 前, 先把源地址放入 EBX, 把字節序號放入 AL ;執行后, 指定字節被讀入 AL ? .data ??? szText db 'ABCDEFG', 0 .code main proc ??? lea ebx, szText ? ? mov al, 1 ??? xlat??? ??? PrintHex al ;42 - 這是 'B' 的 ASSII 編碼 ??? ??? mov al, 2 ??? xlatb ??? PrintHex al ;43 - 這是 'C' 的 ASSII 編碼 ??? ret main endp end main --------------------------------------------------------------------------------------------------------------- MOVSX 指令 格式: MOVSX OPD,OPS 功能: 將8位或16位的OPS符號擴展為16位或32位, 再傳給OPD.所謂的符號擴展, 就是當??? ----? 把一個字節擴展為字或是一字擴展為雙字時,高位字節的各位和原數最高位相同,這??????? 可以保證原來用補碼表示的數值不變.這條指令一般用于帶符號數的擴展. 如果源操作數的最高位是 1, MOVSX 會將目標寄存器中高出的位補 1; 反之補 0 說明: 指令舉例 1. MOVSX EAX ,BX???? 2. MOVSX ECX,CL???? 3. MOVSX DX,DL ? .data ??? bVal?? db 90h ??? dwVal1 dw 7FFFh ??? dwVal2 dw 8000h .code main proc ??? movzx eax, dwVal1 ??? movsx edx, dwVal1 ??? PrintHex eax ;00007FFF ??? PrintHex edx ;00007FFF ??? ??? movzx eax, dwVal2 ??? movsx edx, dwVal2 ??? PrintHex eax ;00008000 ??? PrintHex edx ;FFFF8000 ??? ??? mov cl, bVal ??? movzx ax, cl ??? movsx dx, cl ??? PrintHex ax? ;0090 ??? PrintHex dx? ;FF90 ??? ret main endp end main ------------------------------------------------------------------------------------------------------------------------------- |