?? 指令.txt
字號:
SAL OPR , CNT //Byte/Word
SAL指令與SHL指令完全相同
SAR(Shift Arithmetic Right) 算術右移指令
SAR OPR , CNT //Byte/Word
SAR指令每次移位時,將最高位移入次高位的同時最高位值不變,最低位D0移出并移到CF.
循環移位指令
ROL ( ROtate Left) 循環左移指令
ROL OPR , CNT //Byte/Word
每次移位時,最高位移出并同時移到CF和最低位D0.
ROR (ROtate Right)循環右移指令
ROR OPR,CNT //Byte/Word
每次移位時,最低位D0移出并同時移到CF和最高位.
帶進位循環移位指令
RCL (Rotate Left through Carry)帶進位循環左移指令
RCL OPR,CNT //Byte/Word
RCR (Rotate Right through Carry)帶進位循環左移指令
RCR OPR ,CNT //Byte/Word
JMP ( JuMP ) 無條件轉移指令
名稱
格式
執行操作
段內直接短跳轉 JMP SHORT OPR IP=IP+8位偏移量
段內直接近轉移 JMP NEAR PTR OPR IP=IP+16位偏移量
段內間接轉移 JMP WORD PTR OPR IP=(EA)
段間直接轉移 JMP FAR PTR OPR IP=OPR偏移地址,CS=OPR段地址
段間間接轉移 JMP DWORD PTR OPR IP=(EA),CS=(EA+2)
1.無條件轉移到指定的地址去執行從該地址開始的指令.
2.段內轉移是指在同一代碼段的范圍內進行轉移,只需改變IP寄存器內容.
3.段間轉移則要轉移到另一個代碼段執行程序,此時要改變IP寄存器和CS段寄存器的內容.
條件轉移指令:根據上一條指令所設置的條件碼(標志位)來判斷測試條件.
根據五個標志位:ZF、SF、OF、 PF、 CF的兩種狀態(0 FALSE或1 TRUE)產生10種測試條件.
Name Flag Flag == TRUE [1] Flag ==FALSE [ 0]
Zero Falg ZF JZ OPR //結果為零轉移 JNZ OPR //結果不為零轉移
Sign Falg SF JS OPR //結果為負轉移 JNS OPR //結果為正轉移
Overflow Flag OF JO OPR //溢出轉移 JNO OPR //不溢出轉移
Parity Flag PF JP OPR //結果為偶轉移 JNP OPR //結果為奇轉移
Carry Flag CF JC OPR //有進位轉移 JNC OPR //無進位轉移
兩個數比較:
情況 無符號數 有符號數
指令 滿足條件 指令 滿足條件
A < B JC CF==1 JL SF^OF==1 && ZF==0
A ≥ B JNC CF==0 JNL SF^OF==0 || ZF==1
A ≤ B JNA CF==1 || ZF==1 JLG SF^OF==1 || ZF==1
A > B JA CF==0 && ZF==0 JG SF^OF==0 && ZF==0
測試CX轉移指令
JCXZ OPR //CX==0時轉移
LOOP(LOOP)循環指令
LOOP OPR 測試條件:CX ≠ 0 //OPR在程序中實際是個標號
LOOPZ OPR 測試條件:ZF == 1 && CX ≠ 0
LOOPNZ OPR 測試條件:ZF == 0 && CX ≠ 0
執行操作: 先執行CX=CX-1,再檢測上面的測試條件,如滿足則IP=IP+符號擴展的D8,不滿足則退出循環.
過程調用及返回指令
CALL (CALL) 過程調用指令
CALL DST //DST在程序中實際是子程序標號
執行操作:先將過程的返回地址(即CALL的下一條指令的首地址)存入堆棧,然后轉移到過程入口地址執行子程序.
調用方式 格式 斷點保護入棧情況 過程入口地址
段內直接 CALL NEAR PTR PR1 (SP-1)(SP-2)←IP , CS不進棧 CS值保持不變,IP←DST
段內間接 CALL WORD PTR (EA) (SP-1)(SP-2)←IP , CS不進棧 CS值保持不變,IP←(EA)
段間直接 CALL FAR PTR PR1 (SP-1)(SP-2)←CS , (SP-3)(SP-4)←IP IP←DST偏移地址,CS←DST段地址
段間間接 CALL DWORD PTR (EA) (SP-1)(SP-2)←CS , (SP-3)(SP-4)←IP IP←(EA),CS←(EA+2)
注:為了表明是段內調用,可使用NEAR PTR屬性操作符作說明.
RET(RETurn)子程序返回指令
RET
RET EXP //帶立即數返回
子程序返回指令RET放在子程序末尾,它使子程序在執行完全部任務后返回主程序繼續執行被打斷后的程序.返回地址在子程序調用時入棧保存的斷點地址-IP或IP和CS.
CLC (CLear Carry) 進位位置0指令
CLC //執行操作后,CF=0
CMC (CoMplement Carry) 進位位求反指令
CMC //執行操作后,CF=!CF
STC (SeT Carry) 進位位置1指令
STC //執行操作后,CF=1
NOP (No Operetion) 無操作指令
NOP //此指令不執行任何操作,其機器碼占一個字節單元
HLT (HaLT) 停機指令
HLT
執行操作后,使機器暫停工作,使處理器CPU處于停機狀態,以等待一次外部中斷到來,中斷結束后,程序繼續執行,CPU繼續工作.
同一個程序中,標號或變量只能定義一次.
標號有三種屬性:段、偏移、類型(NEAR PTR,WORD PTR,FAR PRT,DWORD PTR)
數值回送操作符:TYPE、LEGNTH、SIZE、OFFSET、SEG
TYPE expression(or label)
如果表達式是變量,則回送該變量以字節數表示的類型:DB為 1, DW為 2, DD為 4...
如果表達式是標號,則回送該標號類型的數值:NEAR為 -1, FAR為 -2.
如果表達式是常量,則回送0.
array DW A110H,B02CH,C322H ADD AX, TYPE array 等價于 ADD AX, 2
LENGTH variable 對于變量使用DUP的情況,將回送分配給該變量的單元數; 對其它情況則回送1.
fees DW 100 DUP(?) MOV CX, LEGNTH fees 等價于MOV CX, 100
SIZE variable 回送分配給該變量的字節數
MOV CX, SIZE fees 等價于 MOV CX, 200
OFFSET variable (or lable) 回送變量或標號的偏移地址.
MOV BX,OFFSET OPER_ONE 等價于 LEA BX OPER_ONE 語句 ,將OPER_ONE的偏移地址送入BX
SEG variable(or lable) 回送變量或標號的段地址.
若OPER_ONE是DATA_SEG數據段中的一個變量,下面語句取得DATA_SEG段首地址
MOV DS , SEG OPER_ONE 等價于 MOV AX , DATA_SEG MOV DS , AX
屬性操作符:PTR、THIS、HIGH、LOW、HIGHWORD、LOWWORD
type PTR expression 用來給已分配的存儲地址賦予另一種屬性,使該地址具有另一種類型.
表示按expression表達式尋址,按指定的類型type看待.
即PTR是給后面的expression操作數賦予新的數據類型或地址類型.
MOV BYTE PTR[BX] , 5 //存入字節(Byte)單元
MOV WORD PTR[BX] , 5 //存入字(Word)單元
THIS type 指定與當前地址計數器相等的一個地址單元的類型.type是NEAR、FAR、PROC,也可以是BYPE、WORD...
first_type EQU THIS BYTE
word_table DW 100 DUP(?) 此時,first_type的偏移地址與word_table完全相同,但它是字節類型
HIGH (LOW) express 字節分離操作符, HIGH取高位字節, LOW取低位字節.
HIGHWORD (LOWWORD) express 字分離操作符, HIGHWORD取高位字, LOWWORD取低位字.
CONST EQU 0ABCDH MOV AH, HIGHT CONST 等價于MOV AH,0ABH
數據定義語句:
variable_name Mnemonic oper1, oper2.....
常用的助記符Mnemonic有:
DB 定義字節,表示其后每個操作數占有一個字節(1Byte)單元
DW 定義字,表示表示其后每個操作數占有一個字(2Byte)單元
DD 定義雙字,表示表示其后每個操作數占有兩個字(4Byte)單元
DQ 定義四個字,表示表示其后每個操作數占有四個字(8Byte)單元
DT 定義十個字節,表示表示其后每個操作數占有十個字(10Byte)單元,形成壓縮BCD碼.
data_byte DB 10 , 4 , 10H , ? //共定義了4個字節,其中 '?' 是保留單元
data_word DW 100,?,100H //共定義了3個字(6Byte)
str_aa DB 'ABCDEFG' //定義和初始化多于兩個能上能下字符的字符串時,只能使用DB偽指令.
符號定義語句(即常量)
name EQU expression //定義
PURGE name1,name2... //解除
CONSTANT EQU 256 //表示CONSTANT的值為256
段定義語句:SEGMENT ... ENDS、ASSUME、ORG
segmnet_name SEGMENT [align_type] [combine_type] [use_type] [class]
...
segment_name ENDS //SEGMENT和ENDS成對使用,把匯編語句分成段
對于數據段、附加段和堆棧段,一般是存儲單元定義、初始化數據、分配單元等偽指令.
對于代碼段,主要是指令序列和偽指令.
可選項說明:詳細信息
定位類型align_type:說明段的起始地址就有怎有怎樣的邊界值.
PARA 缺省項. 指定段的起始地址須從小段邊界開始,即以16進表示地址時最低位必須為0.
BYTE 可從任何地址開始.
WORD 必須從字的邊界開始,即段地址必須是偶數..
DWORD 必須從雙字的邊界開始,即以16進制表示地址時最低位必須是4的倍數.
PAGE 必須從頁的邊界開始,即以16時制表示地址時最低兩位必須為00.(能被256整除)
組合類型combine_type:說明程序連接的段合并方法.
PRIVATE 缺省項.為私有段,連接時不與其他模塊中的同名分段合并.
PUBLIC 將與相同名字的其它分段合并.
COMMON 將與相同名字的其它分段合并且會產生覆蓋.
MEMORY 同PUBLIC.
STACK 指定該段在運行時為堆棧的一部分.
使用類型use_type:只適用386及其后繼機型,用來說明是USE16(16位尋址)還是USE32(32位尋址).
類別class:用引號中給出連接時組成段組的類型名.
ASSUME使匯編程序在匯編指令時,能知道各段寄存器的值.
ASSUEM segment_registername : segment_name , segment_registername : segment_name...
任何對存存儲器或堆棧的訪問的指令,都將使用CS、DS、ES和SS段寄存器的值才能形成真正的物理地址.
ASSUME只指定某個段分配給某個寄存器,并不能把段地址裝入段寄存器.
所以,DS、ES、SS段寄存器的值必須通過MOV指令來賦予,CS段寄存器在程序初始化時自動完成.
為了給存儲單元設置起始偏移地址,可以用ORG偽指令.
ORG 表達式 //表達式的值范圍必須在0 ~ +65535
偽指令ORG可設置于代碼段、數據段的任何地方.
mydata SEGMENT //段定義,段名為mydata
ORG 100H //置mydata段的起始偏移地址為100H
X DB 12H , ? , 30H //數據定義,X 的偏移地址為0100H, X+1=0101H, X+2=0102H
Z DD 9C56H //Z的偏移地址為0103H
mydata ENDS
mycode SEGMENT
ASSUME CS : mycode , DS : mydata //用ASSUME偽指令分配段寄存器
start: MOV AX , mydata //等價于MOV AX , SEG X語句, 將mydata段的起始地址裝入到DS
MOV DS , AX
...
mycode ENDS
END start //源程序結束指令END, 其中start為lable
過程定義語句:PROC ... ENDP
procedure_name PROC [ NEAR | FAR ] //要說明是NEAR過程或FAR過程.
...
RET //RET 返回指令必須與[ NEAR | FAR ] 對應
procedure_name ENDP //PROC 和ENDP必須有名字,兩者成對出現.
宏指令語句:MACRO...ENDM
macro_name MACRO [ parameter_list ] //形參 parameter_list 可選,有多個參數時,中間用逗號隔開.
...
ENDM
MULTIPLY MACRO OPR1 , OPR2 , RESULT //宏定義,宏名MULTIPLY,形參為OPR1,OPR2和RESULT
PUSH DX
PUSH AX
MOV AX , OPR1
IMUL OPR2
MOV RESULT , AX
POP AX
POP DX
ENDM
MULTIPLY 240 , BX , SAVE //宏調用,實參為240 , BX , SAVE
宏指令與子程序的區別:
子程序產生目標代碼少,占用內存少,但執行時間長,速度慢.
宏指令產生目標代碼長,占用內存多,但執行時間短,速度快.
程序開始和結束語句:NAME | TITLE、END
模塊名:NAME moudle_name
標題名:TITLE text
源程序結束指令:END [ lable ]
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -