回 帖 发 新 帖 刷新版面

主题:[推荐] CASL语言简介


                  CASL 汇 编 语 言 文 本

一、处理机COMET说明

    1.  COMET是一台字长为16位的定点计算机。主存储器的容量是65536字,按编
号0000~FFFF(十六进制)编址。
    2.  一个字的16位二进位采用自左至右的次序编号,即
      0   1   2   3   4   5   6   7   8   9   10  11  12  13  14  15
    ┌─┬─┬─┬─┬─┬─┬─┬─┬─┬─┬─┬─┬─┬─┬─┬─┐
    │  │  │  │  │  │  │  │  │  │  │  │  │  │  │  │  │
    └─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┘
    3.  一个字的16可以是:
    . 不带符号的二进制非负整数。此时一个字能表示的数的范围是:
                       0 ≤ X ≤ 65535
    . 用补码表示的带符号的二进制整数,此时一个字能表示的数的范围是:
                  -32768 ≤ X ≤ 32767
    . 地址常数。此时一个字能表示的地址写成十六进制时是:
                  0000 ~ FFFF
    . 字符数据。此时一个字的高8位皆应为零,低8位为字符的ASCII编码,即:
      0   1   2   3   4   5   6   7   8   9   10  11  12  13  14  15
    ┌─┬─┬─┬─┬─┬─┬─┬─┬───────────────┐
    │0 │0 │0 │0 │0 │0 │0 │0 │      字 符 的 ASCII 码       │
    └─┴─┴─┴─┴─┴─┴─┴─┴───────────────┘
    4.  COMET具有5个通用寄存器GR(16位),一个指令计数器PC(16位)和一个标志
寄存器FR(2位)。它们的作用是:
    . GR (通用寄存器)。5个通用寄存器的编号为0、1、2、3、4,分别记为GR0、
GR1、GR2、GR3、GR4。这些通用寄存器用于算术、逻辑、比较、移位等运算,其中
GR1、GR2、GR3、GR4通用寄存器还兼作变址寄存器。另外,GR4还兼作栈指针 (SP)
用,栈指针是存放栈顶地址用的寄存器。
    . PC (指令计数器) 。在执行指令的过程中,PC中存放着正在执行的指令的第
一个地址(一条指令占二个字)。当指令执行结束时,置入下一条将要被执行的指令
的第一个字的地址. 也就是说,在指令执行结束时,一般是把PC的内容加2,只有在
执行转移指令且转移条件成立时,才将转移地置入PC中。
    . FR (标志寄存器)。在ADD、SUB、AND、OR、EOR、CPA、CPL、SLA、SRA、SLL、
SRL、LEA等指令执行结束时,根据执行结果,将FR置成00、01、10。它不会因其它
指令的执行而改变。
    5.  COMET的控制方式为顺序控制。 指令由32位二进位构成。即双字长,其构
成没有定义。
    6.  指令的符号表示:
    GR  泛指通用寄存器。 可用数字0、1、2、3、4来指定,也可以用GR0、GR1、
GR2、GR3、GR4来指定。
    XR  泛指变址寄存器。可用数字1、2、3、4来指定,也可以用GR1、GR2、GR3、
GR4来指定。
    SP  栈指针(第4号通用寄存器)。
    ADR 标号(表示与标号对应的地址),为10进制数(-32768≤ADR≤65535;ADR作
为地址,具有0~65535的值,而32768~65535的值也可以用负的10进制常数表示)。
    (X) 表示地址中的内容,如果X是通用寄存器时表示通用寄存器中的内容。
    E   表示有效地址。形成有效地址E的规则是:
        E = ADR [+(XR)] (mod 65536)
    [ ] 表示被[]包围的部分可以省略(以下同),XR省略时,表示不使用变址寄存
器。
    7. COMET有23种指令。 指令的名称、书写格式及其功能见附表1。指令的书写
格式用汇编语句的形式给出。

    附表1
    ━━━━━┯━━━━━━━━━━┯━━━━━━━━━━━━━━━━━
              │    书  写  格  式  │
      名  称  ├───┬──────┤      功          能
              │指令码│ 操  作  数 │
    ━━━━━┿━━━┿━━━━━━┿━━━━━━━━━━━━━━━━━
     取数     │LD    │GR,ADR[,XR] │(E) => GR
    ─────┼───┼──────┼─────────────────
     存数     │ST    │GR,ADR[,XR] │(GR) => E
    ─────┼───┼──────┼─────────────────
     取地址*  │LEA   │GR,ADR[,XR] │E => GR
    ─────┼───┼──────┼─────────────────
     加法*    │ADD   │GR,ADR[,XR] │(GR)+(E) => GR
    ─────┼───┼──────┼─────────────────
     减法*    │SUB   │GR,ADR[,XR] │(GR)-(E) => GR
    ─────┼───┼──────┼─────────────────
     逻辑乘*  │AND   │GR,ADR[,XR] │(GR)∧(E) => GR
    ─────┼───┼──────┼─────────────────
     逻辑加*  │OR    │GR,ADR[,XR] │(GR)∨(E) => GR
    ─────┼───┼──────┼─────────────────
     按位加*  │EOR   │GR,ADR[,XR] │(GR)异或(E) => GR
    ─────┼───┼──────┼─────────────────
              │      │            │视(GR)和(E)为用补码表示的
              │      │            │带符号的二进制整数。
     算术比较 │CPA   │GR,ADR[,XR] │若 (GR) > (E) 则 00 => FR
              │      │            │若 (GR) = (E) 则 01 => FR
              │      │            │若 (GR) < (E) 则 10 => FR
    ─────┼───┼──────┼─────────────────
              │      │            │视(GR)和(E)为无符号的二进制
              │      │            │非负整数。
     逻辑比较 │CPL   │GR,ADR[,XR] │若 (GR) > (E) 则 00 => FR
              │      │            │若 (GR) = (E) 则 01 => FR
              │      │            │若 (GR) < (E) 则 10 => FR
    ─────┼───┼──────┼─────────────────
     算术左移*│SLA   │GR,ADR[,XR] │把(GR)向左或向右移动E位。在算术移
    ─────┼───┼──────┤位时,GR中的第0位保持不变。在右移
     算术右移*│SRA   │GR,ADR[,XR] │时空出的位被置成与第0位相同的 1或
    ─────┼───┼──────┤0;在左移时空出的位被置成0 。在逻
     逻辑左移*│SLL   │GR,ADR[,XR] │辑移位时,GR中的16位一起移动 ,而
    ─────┼───┼──────┤空出的位被置成0。
     逻辑右移*│SRL   │GR,ADR[,XR] │
    ─────┼───┼──────┼─────────────────
     无条件转 │JMP   │ADR[,XR]    │无条件向有效地址E转移,即E=>PC
    ─────┼───┼──────┼─────────────────
    大于等于转│JPZ   │ADR[,XR]    │根据FR的值向有效地址E转移,
    ─────┼───┼──────┤即E=>PC;不转移时执行下一条
     小于转   │JMI   │ADR[,XR]    │指令,即(PC)+2=>PC(注)。
    ─────┼───┼──────┤
     不等转   │JNZ   │ADR[,XR]    │
    ─────┼───┼──────┤
     等于转   │JZE   │ADR[,XR]    │
    ─────┼───┼──────┼─────────────────
     进栈     │PUSH  │ADR[,XR]    │(SP)-1=>SP, E=>(SP)
    ─────┼───┼──────┼─────────────────
     退栈     │POP   │GR          │((SP))=>GR, (SP)+1=>SP
    ─────┼───┼──────┼─────────────────
              │      │            │先形成有效地址E,再依次执行
     调用     │CALL  │ADR[,XR]    │(SP)-1=>SP
              │      │            │(PC)+2=>(SP)
              │      │            │E=>PC
    ─────┼───┼──────┼─────────────────
     返回     │RET   │            │((SP))=>PC, (SP)+1=>SP
    ━━━━━┷━━━┷━━━━━━┷━━━━━━━━━━━━━━━━━
    注:
        ─────┬────────
           指  令 │ 转移时FR的值
        ─────┼────────
           JPZ    │  00 或 01
        ─────┼────────
           JMI    │  10
        ─────┼────────
           JNZ    │  00 或 10
        ─────┼────────
           JZE    │  01
        ─────┴────────
     *这些指令还根据执行结果(GR中的值),形成FR的值。其规则是:
          若GR中的第0位为0且其余各位不全为0,则FR被置成00;
          若GR中的16位全为0,则FR被置成01;
          若GR中的第0位为1,则FR被置成10;

二、汇编语言CASL说明

    COMET的汇编语言是CASL,其语法规则说明如下:
    1. 指令的种类和书写格式
    CASL由4种伪指令(START,END,DS,DC) 、3种宏指令(IN,OUT,EXIT)和23种
符号指令(COMET的指令)组成。
    CASL的每条指令书写在一行内(最多不超过72个字符) ,它的书写格式如附表2
所示。
    附表2
          ━━━━━┯━━━━┯━━━━━━━┯━━━━━
            标  号  │ 指令码 │   操 作 数   │  注  释
          ─────┼────┼───────┼─────
          [LABEL]   │ START  │   [LABEL]    │
          ─────┼────┼───────┼─────
                    │ END    │    空  白    │
          ─────┼────┼───────┼─────
          [LABEL]   │ DC     │    常  数    │
          ─────┼────┼───────┼─────
          [LABEL]   │ DS     │  区域的字数  │
          ─────┼────┼───────┼─────
          [LABEL]   │ IN     │ALABEL,NLABEL │
          ─────┼────┼───────┼─────
          [LABEL]   │ OUT    │ALABEL,NLABEL │
          ─────┼────┼───────┼─────
          [LABEL]   │ EXIT   │    空  白    │
          ─────┼────┴───────┼─────
          [LABEL]   │   符号指令参照上节 7   │
          ━━━━━┷━━━━━━━━━━━━┷━━━━━
    由附表2可知,CASL每条指令由标号(可缺省) 、指令码、操作数(可缺省)和注
释4栏构成,每一栏的书写规则如下:
    标 号 栏:从第一个字符位置开始,最多不超过6个字符位置。
    指令码栏:在无标号时,从第二个字符以后的任意字符位置开始;在有标号时,
标号后面至少有一个空白,从其后的任意字符位置开始。
    操作数栏:指令码后至少有一个空白,其后到第72个字符位置,不能继续到下
一行。
    注 释 栏:行里有分号(; )时,其后直到终了作为注释处理。在注释栏里可以
书写任何字符。
    LABEL泛指标号, 标号最多不超过六个字符,开头必须是英文大写字母,以后
可为英文大写字母或数字。
    用空白表示的栏里不得写入字符。
    2.  伪指令
    (1) [LABEL] START [LABEL]
    表示程序的开头,即在程序的开始必须书写。
    操作数栏中的标号是这个程序中定义的标号,它指出该程序的启动地址,在缺
省的情况下,程序从头开始执行。
    标号栏中的标号可以作为其它的程序进入该程序的入口。
    (2) END
    表示程序的终止,在程序的末尾书写。
    (3) [LABEL] DC 常数
    用来指定和存储常数,常数分十进制常数、十六进制常数、地址常数和字符串
常数四种。
    标号栏中的标号是代表被指定的十进制常数、十六进制常数、地址常数的存储
地址或代表被指定的字符串常数的存储区域的第一字的地址。
    十进制常数:  DC  n
    用n指定一个十进制数(-32768≤n≤65535),并将n转换成二进制数存储在一个
字中。如果n超出规定的范围,则将其低16位存储起来。
    对32768~65535的十进制数也可以用负的十进制常数表示。
    十六进制常数:  DC  #h
    用h指定一个4位十六进制数(0000≤h≤FFFF),并将h对应的二进制数存储在一
个字中(在h的前面必需写上#)。
    地址常数:  DC LABEL
    将标号LABEL所对应的地址作为一个字的二进制数存储。若LABEL在程序中没有
定义,汇编将保留地址的定义,并由操作系统处理。
    字符串常数:  DC  '字符串'
    将字符串从左开始的每个字符转换成字符数据(参阅上节3) ,并依次把字符数
据存储在连续的各字中。
    (4) [LABEL] DS 区域的字数
    用来保留指定的字数的存储区域。
    区域用字数,用十进制常数(≥0)指定。
    标号栏中的标号是代表被保留的存储区域的第一个字的地址。
    区域的字数为0时, 存储区域不存在,但是标号中的标号仍有效,即代表下一
字的地址。
    3. 宏指令
    宏指令是根据事先定义的指令串和操作的信息,生成指令功能的指令串。
    CASL中有进行输入、输出及结束程序等宏指令,而没有定义输入、输出符号指
令、这类处理由操作系统完成。
    程序中出现宏指令时,CASL生成调用操着系统的指令串,但是,生成的指令串
的字数不定。
    执行宏指令时,GR的内容保持不变而FR的内容不确定。
    (1)  [LABEL]  IN ALABEL,NLABEL
    宏指令IN,从输入装置上输入一个记录,记录中的信息(字符)依次按字符数据
的形式被顺序存放在标号为ALABEL开始的区域内,已输入的字符个数以二进制数存
放在标号为NLABEL的字中。记录之间的分隔符号不输入。
    (2)  [LABEL]  OUT ALABEL NLABEL
    宏指令OUT, 将存放在从标号ALABEL开始的区域中的字符数据,作为一个记录
向输出装置输出,输出的字符个数由标号为NLABEL的字中的内容指定。输出时,若
要记录间的间隔符号,由操作系统自动插入输出。
    (3) [LABEL]  EXIT
    宏指令EXIT,表示程序执行终止,控制返回操着系统。
    4. 符号指令  参阅上节7。
    5. 指令字、区域的相对位置
    由汇编生成的指令字和区域的相对位置按汇编语言程序的书写顺序确定,并且
生成的指令字、区域占有的主存的连续区域。

回复列表 (共1个回复)

沙发

[font=楷体_GB2312]这个不是高级程序员考卷后的附录嘛[/font][color=00FF00][/color]

我来回复

您尚未登录,请登录后再回复。点此登录或注册