一、Casl匯編語言語法介紹
學(xué)習(xí)一個匯編語言需要掌握3個要點:CPU 的可編程寄存器結(jié)構(gòu)、尋址方式及指令系統(tǒng)、偽指令。
1、COMETCPU 的可編程寄存器
COMETCPU 字長 16 位,采用從左到右的編號。bit0 在最左邊(位),bit15 在最右邊(最低位)
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
1)16 位通用寄存器五個:
GR0、GR1、GR2、GR3、GR4
通用功能:各種算術(shù)邏輯運算
特殊功能:除 GR0 外都可作變址寄存器(地址指針)XR,GR0 可看成累加器。
GR4 兼作堆棧指針(SP)
2)指令計數(shù)器 PC 一個(16位)
存放正在執(zhí)行的那條指令的第 1 個字的地址(一條指令占二個字),指令結(jié)束時,PC 中存放下一條指令的地址 (一般為原指令地址 +2 )。
3)狀態(tài)寄存器 FR 一個(二位)
運算結(jié)果 FR0 FR1
大于 0 0
等于 0 1
小于 1 0
可以把 FR0 看成 SF(符號位),F(xiàn)R1 看成 ZF(零位位)
除了算術(shù)邏輯運算指令(包括移位指令)外,LEA 指令也會影響 FR
2、符號指令寫法與尋址方式
OP GR,ADR[,XR]
其中 OP 為操作碼;GR 為五個通用寄存器 GR0~GR4 之一;ADR 為一個 16 位的地址碼;XR 為四個變址寄存器 GR1~GR4 之一,[ ]表示可以省略。
1)直接尋址:當(dāng) [,XR] 省略時,為直接尋址。
2)變址尋址:有效地址 E = ADR +(XR),當(dāng) ADR = 0 時,為寄存器間接尋址。
3)立即數(shù)尋址:Casl 沒有立即數(shù)尋址。但在 LEA 指令中,當(dāng) [,XR] 省略時,可作立即數(shù)傳送。沒有立即數(shù)運算指令。
4)寄存器尋址:Casl 也沒有寄存器尋址(對源操作數(shù))。但 LEA 指令當(dāng) ADR = 0 時,可作寄存器尋址(只用 于數(shù)據(jù)傳送)。
3、Casl指令系統(tǒng)
1)取數(shù)指令 LD:內(nèi)存→寄存器
LD GR,ADR[,XR]
2)存數(shù)指令 ST:寄存器→內(nèi)存
ST GR,ADR[,XR]
3)加法 ADD、減法 SUB、邏輯與 AND、邏輯或OR、邏輯異或 EOR指令:
ADD ┐
SUB │
AND ├ GR,ADR[,XR]
OR │
EOR ┘
內(nèi)存 OP 寄存器→寄存器
4)算術(shù)比較 CPA:
兩個帶符號數(shù)比較,結(jié)果不回送,只影響標(biāo)志位。
CPA GR,ADR[,XR]
5)邏輯比較 CPL:兩個無符號數(shù)比較,結(jié)果不回送,只影響標(biāo)志位。
CPL GR,ADR[,XR]
6)算術(shù)左移 SLA、算術(shù)右移 SRA:把操作數(shù)看成帶符號數(shù)。對寄存器操作數(shù)進(jìn)行移位(GR 的第 0 位——符號位不變。右移時空出的其余位補(bǔ)與第 0 位相同的 1 或 0 ;左移時空出的位補(bǔ) 0 ),位數(shù)由有效地址 E 決定。
SLA ┐ GR,ADR[,XR]
SRA ┘
7)邏輯左移 SLL、邏輯右移 SRL:把操作數(shù)看成無符號數(shù)。對寄存器操作數(shù)進(jìn)行移位(不管左右移,GR 空出的位補(bǔ) 0 ),位數(shù)由有效地址 E 決定。
SLL ┐ GR,ADR[,XR]
SRL ┘
8)取有效地址指令LEA:E→寄存器
LEA GR,ADR[,XR]
該指令有幾個特殊用途:
【例1】LEA GR0,41H 把立即數(shù) 41H 送給 GR0
【例2】LEA GR0,0,GR1 把寄存器 GR1 的內(nèi)容送給 GR0
【例3】LEA GR1,1,GR1 寄存器 GR1 的內(nèi)容加 1(相當(dāng)于 8086 匯編中的 INC 指令)
【例4】LEA GR1,-1,GR1 寄存器 GR1 的內(nèi)容減 1(相當(dāng) 8086 匯編中的 DEC 指令)
【例5】LEA GR1,N,GR1 寄存器 GR1 的內(nèi)容加 N(相當(dāng)于立即數(shù)加法)
【例6】LEA GR1,-N,GR1 寄存器 GR1 的內(nèi)容減 N(相當(dāng)于立即數(shù)減法)
9)無條件轉(zhuǎn)移指令JMP與條件轉(zhuǎn)移指令JPZ(不小于轉(zhuǎn))、JMI(小于轉(zhuǎn))、JNZ(不等于轉(zhuǎn))、JZE(等于轉(zhuǎn))
JMP ┐
JPZ │
JMI ├ ADR[,XR]
JNZ │
JZE ┘
●當(dāng)?shù)刂反a中缺 [XR] 時,所有轉(zhuǎn)移指令為直接轉(zhuǎn)移( ADR 即為轉(zhuǎn)移地址)
當(dāng)?shù)刂反a中有 [XR] 時,所有轉(zhuǎn)移指令為間接相對接轉(zhuǎn)移
●JPZ 與 JMI 根據(jù)符號位 FR0 作為判斷條件
JNZ 與 JZE 根據(jù)零位位 FR1 作為判斷條件
10)進(jìn)棧 PUSH 與出棧 POP:
(1)進(jìn)棧指令 PUSH:
PUSH ADR[,XR]
(SP)-1→SP,E→(SP)
(2)出棧指令 POP:
POP GR
((SP))→GR,(SP)+1→SP
注意:出棧指令的目的寄存器是 GR0~GR4,而進(jìn)棧指令的源操作數(shù)不包括 GR0。
11)子程序調(diào)用CALL與返回 RET指令
(1)子程序調(diào)用指令 CALL:
CALL ADR[,XR]
(SP)-1→SP,(PC)+2→(SP),E→(PC)
(2)子程序返回指令 RET:
RET
((SP))→PC,(SP)+1→SP
學(xué)習(xí)一個匯編語言需要掌握3個要點:CPU 的可編程寄存器結(jié)構(gòu)、尋址方式及指令系統(tǒng)、偽指令。
1、COMETCPU 的可編程寄存器
COMETCPU 字長 16 位,采用從左到右的編號。bit0 在最左邊(位),bit15 在最右邊(最低位)
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
1)16 位通用寄存器五個:
GR0、GR1、GR2、GR3、GR4
通用功能:各種算術(shù)邏輯運算
特殊功能:除 GR0 外都可作變址寄存器(地址指針)XR,GR0 可看成累加器。
GR4 兼作堆棧指針(SP)
2)指令計數(shù)器 PC 一個(16位)
存放正在執(zhí)行的那條指令的第 1 個字的地址(一條指令占二個字),指令結(jié)束時,PC 中存放下一條指令的地址 (一般為原指令地址 +2 )。
3)狀態(tài)寄存器 FR 一個(二位)
運算結(jié)果 FR0 FR1
大于 0 0
等于 0 1
小于 1 0
可以把 FR0 看成 SF(符號位),F(xiàn)R1 看成 ZF(零位位)
除了算術(shù)邏輯運算指令(包括移位指令)外,LEA 指令也會影響 FR
2、符號指令寫法與尋址方式
OP GR,ADR[,XR]
其中 OP 為操作碼;GR 為五個通用寄存器 GR0~GR4 之一;ADR 為一個 16 位的地址碼;XR 為四個變址寄存器 GR1~GR4 之一,[ ]表示可以省略。
1)直接尋址:當(dāng) [,XR] 省略時,為直接尋址。
2)變址尋址:有效地址 E = ADR +(XR),當(dāng) ADR = 0 時,為寄存器間接尋址。
3)立即數(shù)尋址:Casl 沒有立即數(shù)尋址。但在 LEA 指令中,當(dāng) [,XR] 省略時,可作立即數(shù)傳送。沒有立即數(shù)運算指令。
4)寄存器尋址:Casl 也沒有寄存器尋址(對源操作數(shù))。但 LEA 指令當(dāng) ADR = 0 時,可作寄存器尋址(只用 于數(shù)據(jù)傳送)。
3、Casl指令系統(tǒng)
1)取數(shù)指令 LD:內(nèi)存→寄存器
LD GR,ADR[,XR]
2)存數(shù)指令 ST:寄存器→內(nèi)存
ST GR,ADR[,XR]
3)加法 ADD、減法 SUB、邏輯與 AND、邏輯或OR、邏輯異或 EOR指令:
ADD ┐
SUB │
AND ├ GR,ADR[,XR]
OR │
EOR ┘
內(nèi)存 OP 寄存器→寄存器
4)算術(shù)比較 CPA:
兩個帶符號數(shù)比較,結(jié)果不回送,只影響標(biāo)志位。
CPA GR,ADR[,XR]
5)邏輯比較 CPL:兩個無符號數(shù)比較,結(jié)果不回送,只影響標(biāo)志位。
CPL GR,ADR[,XR]
6)算術(shù)左移 SLA、算術(shù)右移 SRA:把操作數(shù)看成帶符號數(shù)。對寄存器操作數(shù)進(jìn)行移位(GR 的第 0 位——符號位不變。右移時空出的其余位補(bǔ)與第 0 位相同的 1 或 0 ;左移時空出的位補(bǔ) 0 ),位數(shù)由有效地址 E 決定。
SLA ┐ GR,ADR[,XR]
SRA ┘
7)邏輯左移 SLL、邏輯右移 SRL:把操作數(shù)看成無符號數(shù)。對寄存器操作數(shù)進(jìn)行移位(不管左右移,GR 空出的位補(bǔ) 0 ),位數(shù)由有效地址 E 決定。
SLL ┐ GR,ADR[,XR]
SRL ┘
8)取有效地址指令LEA:E→寄存器
LEA GR,ADR[,XR]
該指令有幾個特殊用途:
【例1】LEA GR0,41H 把立即數(shù) 41H 送給 GR0
【例2】LEA GR0,0,GR1 把寄存器 GR1 的內(nèi)容送給 GR0
【例3】LEA GR1,1,GR1 寄存器 GR1 的內(nèi)容加 1(相當(dāng)于 8086 匯編中的 INC 指令)
【例4】LEA GR1,-1,GR1 寄存器 GR1 的內(nèi)容減 1(相當(dāng) 8086 匯編中的 DEC 指令)
【例5】LEA GR1,N,GR1 寄存器 GR1 的內(nèi)容加 N(相當(dāng)于立即數(shù)加法)
【例6】LEA GR1,-N,GR1 寄存器 GR1 的內(nèi)容減 N(相當(dāng)于立即數(shù)減法)
9)無條件轉(zhuǎn)移指令JMP與條件轉(zhuǎn)移指令JPZ(不小于轉(zhuǎn))、JMI(小于轉(zhuǎn))、JNZ(不等于轉(zhuǎn))、JZE(等于轉(zhuǎn))
JMP ┐
JPZ │
JMI ├ ADR[,XR]
JNZ │
JZE ┘
●當(dāng)?shù)刂反a中缺 [XR] 時,所有轉(zhuǎn)移指令為直接轉(zhuǎn)移( ADR 即為轉(zhuǎn)移地址)
當(dāng)?shù)刂反a中有 [XR] 時,所有轉(zhuǎn)移指令為間接相對接轉(zhuǎn)移
●JPZ 與 JMI 根據(jù)符號位 FR0 作為判斷條件
JNZ 與 JZE 根據(jù)零位位 FR1 作為判斷條件
10)進(jìn)棧 PUSH 與出棧 POP:
(1)進(jìn)棧指令 PUSH:
PUSH ADR[,XR]
(SP)-1→SP,E→(SP)
(2)出棧指令 POP:
POP GR
((SP))→GR,(SP)+1→SP
注意:出棧指令的目的寄存器是 GR0~GR4,而進(jìn)棧指令的源操作數(shù)不包括 GR0。
11)子程序調(diào)用CALL與返回 RET指令
(1)子程序調(diào)用指令 CALL:
CALL ADR[,XR]
(SP)-1→SP,(PC)+2→(SP),E→(PC)
(2)子程序返回指令 RET:
RET
((SP))→PC,(SP)+1→SP