您现在的位置: 中国IT实验室 >> 软件水平考试 >> 考试技巧 >> 文章正文
Casl汇编语言辅导(上)

ChinaITLab.com  2003-10-9  保存本文  推荐给好友  QQ上看本站  收藏本站



  一、Casl汇编语言语法介绍
  
  学习一个汇编语言需要掌握3个要点:CPU 的可编程寄存器结构、寻址方式及指令系统、伪指令。
  
  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
  
  通用功能:各种算术逻辑运算
  
  特殊功能:除 GR0 外都可作变址寄存器(地址指针)XR,GR0 可看成累加器。
  
  GR4 兼作堆栈指针(SP)
  
  2)指令计数器 PC 一个(16位)
  
  存放正在执行的那条指令的第 1 个字的地址(一条指令占二个字),指令结束时,PC 中存放下一条指令的地址(一般为原指令地址 +2 )。
  
  3)状态寄存器 FR 一个(二位)
  
  运算结果 FR0 FR1
  大于 0 0
  等于 0 1
  小于 1 0
  
   
  
  可以把 FR0 看成 SF(符号位),FR1 看成 ZF(零位位)
  
  除了算术逻辑运算指令(包括移位指令)外,LEA 指令也会影响 FR
  
  2、符号指令写法与寻址方式
  
  OP GR,ADR[,XR]
  
  其中 OP 为操作码;GR 为五个通用寄存器 GR0~GR4 之一;ADR 为一个 16 位的地址码;XR 为四个变址寄存器 GR1~GR4 之一,[ ]表示可以省略。
  
  1)直接寻址:当 [,XR] 省略时,为直接寻址。
  
  2)变址寻址:有效地址 E = ADR +(XR),当 ADR = 0 时,为寄存器间接寻址。
  
  3)立即数寻址:Casl 没有立即数寻址。但在 LEA 指令中,当 [,XR] 省略时,可作立即数传送。没有立即数运算指令。
  
  4)寄存器寻址:Casl 也没有寄存器寻址(对源操作数)。但 LEA 指令当 ADR = 0 时,可作寄存器寻址(只用于数据传送)。
  
  3、Casl指令系统
  
  1)取数指令 LD:内存→寄存器
  
  LD GR,ADR[,XR]
  
  2)存数指令 ST:寄存器→内存
  
  ST GR,ADR[,XR]
  
  3)加法 ADD、减法 SUB、逻辑与 AND、逻辑或OR、逻辑异或 EOR指令:
  
  ADD ┐
  SUB │
  AND ├ GR,ADR[,XR]
  OR │
  EOR ┘
  
  内存 OP 寄存器→寄存器
  
  4)算术比较 CPA:
  
  两个带符号数比较,结果不回送,只影响标志位。
  
  CPA GR,ADR[,XR]
  
  5)逻辑比较 CPL:两个无符号数比较,结果不回送,只影响标志位。
  
  CPL GR,ADR[,XR]
  
  6)算术左移 SLA、算术右移 SRA:把操作数看成带符号数。对寄存器操作数进行移位(GR 的第 0 位——符号位不变。右移时空出的其余位补与第 0 位相同的 1 或 0 ;左移时空出的位补 0 ),位数由有效地址 E 决定。
  
  SLA ┐ GR,ADR[,XR]
  SRA ┘
  
  7)逻辑左移 SLL、逻辑右移 SRL:把操作数看成无符号数。对寄存器操作数进行移位(不管左右移,GR 空出的位补 0 ),位数由有效地址 E 决定。
  
  SLL ┐ GR,ADR[,XR]
  SRL ┘
  
  8)取有效地址指令LEA:E→寄存器
  
  LEA GR,ADR[,XR]
  
  该指令有几个特殊用途:
  
  【例1】LEA GR0,41H 把立即数 41H 送给 GR0
  
  【例2】LEA GR0,0,GR1 把寄存器 GR1 的内容送给 GR0
  
  【例3】LEA GR1,1,GR1 寄存器 GR1 的内容加 1(相当于 8086 汇编中的 INC 指令)
  
  【例4】LEA GR1,-1,GR1 寄存器 GR1 的内容减 1(相当 8086 汇编中的 DEC 指令)
  
  【例5】LEA GR1,N,GR1 寄存器 GR1 的内容加 N(相当于立即数加法)
  
  【例6】LEA GR1,-N,GR1 寄存器 GR1 的内容减 N(相当于立即数减法)
  
  9)无条件转移指令JMP与条件转移指令JPZ(不小于转)、JMI(小于转)、JNZ(不等于转)、JZE(等于转)
  
  JMP ┐
  JPZ │
  JMI ├ ADR[,XR]
  JNZ │
  JZE ┘
  
  ●当地址码中缺 [XR] 时,所有转移指令为直接转移( ADR 即为转移地址)
  
   当地址码中有 [XR] 时,所有转移指令为间接相对接转移
  
  ●JPZ 与 JMI 根据符号位 FR0 作为判断条件
  
   JNZ 与 JZE 根据零位位 FR1 作为判断条件
  
  10)进栈 PUSH 与出栈 POP:
  
  (1)进栈指令 PUSH:
  
  PUSH ADR[,XR]
  
  (SP)-1→SP,E→(SP)
  
  (2)出栈指令 POP:
  
  POP GR
  
  ((SP))→GR,(SP)+1→SP
  
  注意:出栈指令的目的寄存器是 GR0~GR4,而进栈指令的源操作数不包括 GR0。
  
  11)子程序调用CALL与返回 RET指令
  
  (1)子程序调用指令 CALL:
  
  CALL ADR[,XR]
  
   (SP)-1→SP,(PC)+2→(SP),E→(PC)
  
  (2)子程序返回指令 RET:
  
  RET
  
  ((SP))→PC,(SP)+1→SP
  
  4、伪指令
  
  1)START:程序开始
  
  2)END:程序结尾
  
  3)常量定义指令 DC:
  
  此伪指令与其它汇编语言中的 DB 指令似。利用 DC 指令可定义:
  
  (1)定义十进制常数:
  
  十进制常数名 DC n
  
  其中 -32768 < n ≤65535
  
  (2)定义字符串常数:
  
  字符串常数名 DC '字符串'
  
  (3)定义十六进制常数:
  
  十六进制常数名 DC #h
  
  其中 0000 ≤ h ≤FFFF
  
  (4)定义地址:
  
  地址常数 DC LABLE
  
  其中 LABLE 是程序中的地址标号
  
  因为 Casl 没有立即数运算指令,所以需要与立即数进行算术逻辑运算时,都要将立即数定义为内存常数进行运算。
  
  4)变量定义指令 DS:用来保留指定字数的存储区域
  
  [LABLE] DS n
  
  其中 n 是十进制常数(≥0),当 n=0 时,存储区域不存在,但标号 LABLE 仍然有效,即代表下一字的地址。
  
  5)宏指令:IN、OUT、EXIT
  
  Casl 中有进行输入、输出及结束程序等宏指令,而没有定义输入、输出符号指令,这类处理由操作系统完成。
  
  程序中出现宏指令时,Casl 生成调用操作系统的指令串,但是,生成的指令串字数不定。
  
  执行宏指令时,GR 的内容保持不变,而 FR 的内容不确定。
  
  (1)输入宏指令 IN:
  
  [LABLE] IN ALABLE,NLABLE
  
  宏指令 IN 从输入装置上输入一个记录,纪录中的信息(字符)依次按字符数据的形式存放在标号为 ALABLE 开始的区域内,已输入的字符个数以二进制数形式存放在标号为 NLABLE 的字中,纪录之间的分隔符号不输入。
  
  (2)输出宏指令 OUT:
  
  [ LABLE] OUT ALABLE,NLABLE
  
  宏指令 OUT 将存放在标号为 ALABLE 开始的区域中的字符数据作为一个记录向输出装置输出,输出的字符个数由标号为 NLABLE 的字的内容指定。输出时,若要纪录间的分隔符号,由操作系统自动插入输出。
  
  (3)宏指令 EXIT :
  
  [LABLE] EXIT
  
  宏指令 EXIT 表示程序执行的终止,控制返回操作系统。
  
  二、基本程序结构
  
  1、顺序程序(略)
  
  2、分枝程序
  
  1)简单分支程序
  
  将比较指令(或其它能使标志位发生变化的指令)和条件转移指令结合,可实现分支程序。简单分支程序有两种形式:
  
  
  
  在汇编语言中,采用图a的结构容易出错,例如把GB0中的十六进制数转换成 ASCII 码可分成两段, 0~9 的 ASCII 码是 30H~39H ,即加 30H ;A~F 的ASCII 码是 41H~45H ,即加 37 H。两种结构的程序如下:
  
   图a结构 图b结构
  
   CPL GR0,C10 CPL GR0,C10
   JMI L1 JMI L1
   ADD GR0,C37 ADD GR0,C7
   JMP L2 L1 ADD GR0,C30
  L1 ADD GR0,C30 …
  L2 … C10 DC 10
  C10 DC 10 C7 DC 7
  C37 DC #37 C30 DC #30
  C30 DC #30
  
  若采用图a的结构,很容易把JMP L2漏掉,变成A~F 的ASCII 码加了67H。
  
  2)多岔分支程序
  
  可以用多条比较指令和条件转移指令实现多岔分支。
  
  但用散转表实现多岔分支则程序更为简练,其思路是在散转表中存放各个分支程序的入口地址,用查表方法将入口地址放入变址寄存器,然后用JMP指令或CALL指令的间接寻址方式使程序转到此入口。
  
  【例1】根据键盘输入命令转入各命令处理程序
  
  
  SB START
  AGAIN IN ALABLE,NLABLE
   ;输入一个字符串
   LD GR1,NLABLE ;字符串长度
   LEA GR1,0,GR1
   JZE AGAIN ;若字符串长度 =0,重输
   LD GR1,ALABLE ;将第一个字符放到GR1中
   LEA GR1,-65,GR1 ;减去"A"的ASCII码
   JMI AGAIN ;若该字符<"A",重输
   CPA GR1,C4
   JPZ AGAIN ;若该字符>"D




 相关文章  热门文章
系统分析师论文"论建立企业INTRANET的策略"
计算机软件水平考试:《数据结构》是核心
系统分析员考试备考要略
系统分析员备考之经济管理篇(二)
系统分析员备考之经济管理篇(一)
软件设计师复习--检错码CRC
关于高程下午试题的一些预测与解题方法
程序高手必读:写好C程序的10条秘籍
数据结构学习(C++)——二叉树 
1990-2000年事务处理流程图和数据流图试题分…

 文章评论


认证培训
热门专题       more
相关下载
论坛新帖
博 客