Casl匯編語言輔導(dǎo)(上)

字號:

一、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