基本彙編指令

清風伴月88發表於2006-12-16
 
2:累加器專用傳輸指令
       IN(input) 輸入
       OUT(output) 輸出
       XLAT (tanslate) 換碼
這組指令只限於使用累加器EAX,AX,AL傳送資訊。
IN
長格式執行的操作:(AL)ß(PORT)位元組
                 (AX)ß(PORT+1,PORT)字
                 (EAX)ß(PORT+3,PORT+2,PORT+1,PORT)雙字
短格式執行的操作:(AL)ß((DX))位元組
                            (AL)ß((DX)+1,(DX))字
                            (AL)ß((DX)+3,(DX)+2,(DX)+1,(DX))雙字
OUT
長格式執行的操作:
                            (PORT)ß(AL)位元組
                            (PORT+1,PORT)ß(AX)字
                            (PORT+3,PORT+2,PORT+1,PORT)ß(EAX)雙字
短格式執行的操作:
                            ((DX))ß(AL) 位元組
                            ((DX)+1,(DX))ß(AX) 字
                            ((DX)+3,(DX)+2,(DX)+1,(DX))ß(EAX) 雙字
IN完成從I/0到CPU的資訊傳送,而OUT則完成從CPU到I/O的資訊傳送。CPU只能用累加器(AL,AX,EAX)接受或傳送資訊。
當埠號>=255時,只能使用短格式,此時必須先把斷口號放到DX暫存器中,然後再用IN或OUT指令來傳送資訊。前256個埠可以在指令中直接指定。
3,地址傳送指令
LEA 有效地址送暫存器   REG,SRC
       把源運算元的有效地址傳送到指定的暫存器中。目的運算元不能用斷暫存器。
       MOV,與LEA的區別是MOV傳送的是內容,LEA是傳送的地址。
LDS 指標送暫存器和DS
LES 指標送暫存器和ES
LFS 指標送暫存器和FS
LGS 指標送暫存器和GS
LSS 指標送暫存器和SS
當指令指定的是(16,32)位暫存器時,把該儲存單元中存放的(16,32)位偏移地址(SRC)裝入該暫存器當中,然後把(SRC+2),(SRC+4)中的(16)位數裝入指令暫存器指定的斷暫存器中。
4,型別轉換指令(本組指令均不影響標誌位)
格式:CBW
即如果(AL)的最高有效位為0,則(AH)=0;如(AL)的最高有效位為1,則(AH)=0FFH。
格式:CWD
即如果(AX)的最高有效位為0,則(DX)=0;如(AX)的最高有效位為1,則(DX)=0FFFFH。
格式:CWDE
AX的內容符號擴充套件到EAX,形成EAX中的雙字。
格式:CDQ
EAX的內容符號擴充套件到EDX,形成EDX中的4字。
格式:BSWAP
使指令指定的32位暫存器的位元組次序變反。具體的操作為1,4位元組互換,2,3位元組互換。
5,加法指令:
ADD
ADC DST,SRC
執行的操作:(DST)ß(SRC)+(DST)+CF
INC 加1指令
XADD DST,SRC 交換並相加指令
執行的操作:TEMP ß(SRC)+(DST)
                     (SRC)ß(DST)
                     (DST)ßTEMP
把目的運算元裝入源,並把源和目的運算元之和送入目的地址。
8位二進位制數可以表示十進位制數的範圍是:無符號數0--255,帶符號數-128—127,16位二進位制數可以表示十進位制數的範圍是:無符號數0-65535,帶符號數為-32768--+32767。
減法指令
SUB
SBB 帶借位減法
執行的操作: (DST)ß(DST)—(SRC)—CF
DEC
NEG 求補指令
實質:按位取反後末位加1   (OPR)ß0FFFFH—(OPR)+1
CMP (OPR1)—(OPR2)比較指令
CMP指令後往往跟著一條條件轉移指令,根據比較結果產生不同的程式分支。
CMPXCHG
執行的操作:累加起AC與DST相比較(累加器可以為AL,AX,EAX),如
                     (AC)=(DST)
                     則,(DST)ß(SRC)
                     否則,(SRC)ß(AC)
乘法指令:
MUL 無符號數乘法
執行的操作:      (AX)ß(AL)*(SRC)
                            (DX,AX)ß(AX)*(SRC)
                            (EDX,EAX)ß(EAX)*(SRC)
IMUL 帶符號數乘法 (執行的操作同上)
目的運算元必須是累加器,字運算為AX,位元組運算為AL。使用的條件都是由數的格式決定的。
除法指令:
DIV 無符號數除法
執行的操作:       位元組       (AL)ß(AX)/(SRC)的商
                                   (AH)ß(AX)/(SRC)的餘數
                             (AX)ß(DX,AX)/(SRC)的商
                            (DX)ß(DX,AX)/(SRC)的餘數
                     雙字       (EAX)ß(EDX,EAX)/(SRC)的商
                            (EDX)ß(EDX,EAX)/(SRC)的餘數
IDIV 帶符號數除法
執行的操作與DIV相同,但運算元必須是帶符號數,商和餘數也都是帶符號數,切餘數的符號與被除數符號相同。
邏輯指令
邏輯運算指令
AND
把AND指令的源運算元設定成一個立即數,並把需要遮蔽的位設為0,這樣指令執行的結果就可以把運算元的相應位置0,其他各位保持不變。
OR
NOT    邏輯非
 
以下兩個運算元的結果不儲存,只根據特徵設定條件碼。
XOR    異或
要使運算元的某些位變反,可以使用XOR指令,只要把源運算元的立即數字段的相應位置1就可以達到目的。
TEST    測試
要測試運算元的某位是否為1,可以先把該運算元求反,然後用TEST指令測試。
移位指令:
SHL 邏輯左移
SAL 算術左移
SHR 邏輯右移
SAR  算術右移
ROL 迴圈左移
ROR 迴圈右移
RCL 帶進位迴圈左移
RCR 帶進位迴圈右移
SHLD 雙精度左移
SHRD 雙精度右移
移位指令通常用來作乘以2或除以2的操作。
串處理指令:
MOVS 當該指令與字首REP連用時,則可將資料段中的整串資料傳送到附加段中。這裡,源串必須在資料段中,目的串必須在附加段中,但是源串允許使用段跨越字首來修改。在與REP連用時必須先把資料串的長度值送到記數暫存器中,以便控制指令結束。
執行該指令的準備操作:
1把存放在資料段中的源串首地址放入SI;
2把將要存放資料串的附加段中的目的串首地址放入DI;
3把資料串長度放入記數暫存器;
4建立方向標誌(DF);
STOS 該指令把累加器的內容存入由目的變址暫存器指向的附加段的某單元中,並根據DF的值及資料型別修改目的變址暫存器的內容。當它與REP連用時可把累加器的內容存入一個長度為COUNT REG的緩衝區中。
STOS指令在初始化某一緩衝區時很有用。
LODS
該指令把由源變址暫存器指向的資料段中某單元的內容送到累加器中,並根據DF和資料型別修改源變址暫存器的內容。該指令不和REP連用。
與REPE/REPZ和REPNE/REPNZ聯合工作的CMPS和SCAS指令
可以用來比較倆個資料串,或從一個字串中查詢一個指定的字元。
CMPS SRC,DST
指令把由SRC指向的資料段中的一個位元組,字,雙字與由DST所指向的附加段中的一個位元組,字或雙字相減。但不儲存結果,只根據結果置條件碼。
SCAS DST
指令把累加器的內容與由目的變址暫存器指向的在附加段中的一個位元組,字或雙字進行比較,並不儲存結果,只根據結果設定條件碼。
 
 

相關文章