第4章16位和32位微处理器的指令系统及汇编语言编程内容摘要:

功能:将汇编地址计数器设置成数值表达式的值。 其中 , 数值表达式的值应为非负的整数 , 其值在 0~ 65535之间 例 【 415】 汇编地址计数器和伪指令 ORG举例 DATA SEGMENT ORG 4 BUF DB 39。 readme39。 ORG $+5 NUM DB 2 DATA ENDS 汇编语言中的常量、变量及标号 一 、 常量 常量是指在程序执行期间不变的量。 在8086/8088宏汇编语言中可使用的常量见表 414。 常量主要用于伪指令中给变量赋初值 , 或者用作机器指令语句中的立即操作数 、 变址寻址和基址变址寻址中的位移量。 常量一般可以直接以数值形式出现在汇编语句中 , 这种常量称数值常量。 但对经常使用的数值常量 , 可以事先为它定义一个名字 , 然后在语句中用名字来表示该常量 , 这种常量称符号常量。 伪指令 EQU和等号 “ =”可用来实现将数值常量定义成符号常量 汇编语言中的常量、变量及标号 表 414 8086/8088宏汇编语言中所使用的常量 常量分类 格式 X的取值 举例 二进制常量 XX… XB 0或 1 01000001B 八进制常量 XX… XO XX… XQ 0~ 7 1234Q 十进制常量 XX… X XX… XD 0~ 9 123, 123D 十六进制常量 XX… XH 0~ 9 A~ F 1234H, 0A12FH 字符常量 39。 XX… X39。 XX… X ASCII字符 39。 012339。 readme 汇编语言中的常量、变量及标号 二、变量 在汇编语言中 , 变量是一个数据单元的名字 , 即数据存放地址的符号表示。 它有 3个属性: ① 变量的段属性。 指变量所在段的首地址 ,当需要访问该变量时 , 它所在段的首地址一定要在某一段寄存器中 ② 变量的偏移属性。 指变量所在段的首地址到变量所在的存储单元之间的距离 , 用字节数表示。 它表示变量在某段的相对位置 , 也就是我们所说的偏移地址 ( 或有效地址 ) EA ③ 变量的类型。 指存取某变量所需要的字节数 变量的定义格式如下: [变量名 ] 数据定义伪指令 表达式 [, … ] 汇编语言中的符号常量名 、 变量名 、 段名 、 过程名 、 标号都称为标识符。 标识符是由字母 、 数字 ( 0~ 9) 、 特殊字符 (。 、 .、 @、 _、 $) 等组成的字符串 , 但该字符串不能以数字或下划线 ‘ _’作为开始字符。 标识符最大长度不能超过 31个字符 , 并且汇编语言对字母的大写和小写没有统一要求 , 也就是说 , 汇编语言对标识符中字母的大写和小写不作区分 , 如 ABC、 aBc、 Abc和 aBC都认为是同一个标识符。 注意不能使用汇编语言的保留字如算术运算指令名 ADD、 SUB等做标识符 : ① 数值表达式 ② ASCII字符串 ( 只有用 DB定义变量时 , 才允许字符串长度超过 2个字符 ) ③ 地址表达式。 如果该地址表达式为一变量 ( 或标号 ) 名 , 用 DW伪指令是取它的偏移地址来初始化变量 , 用 DD伪指令是取它的段首址和偏移地址来初始化变量 表达式的几种方式 ④。 (表示所定义的变量初值不确定) ⑤ 重复子句 格式: n DUP(表达式) 其中, n是重复因子,只能取正整数,它表示定义了 n个存储单元,其类型由它前面的数据定义伪指令确定。 而每个存储单元中的初值由 DUP后面圆括号中的表达式给定,如果是 “。 ” ,则表示变量的初值不确定 ⑥ 可以是以上表达式组成的序列,各表达式之间用逗号隔开 例 【 416】 有下面的数据段 , 画出其内存分配图 DATA SEGMENT TABLE DB 1, 2, 3, 2 DUP(6, 2) COUNTER EQU $TABLE VARY DW 1234H CHAR DB ’123’, 3 DUP(1) POINTER1 DW VARY POINTER2 DD CHAR DATA ENDS 标号是机器指令语句存放地址的符号表示 , 也可以是过程名。 过程名实际上是过程入口地址的符号表示 , 即过程第一条机器指令语句的存放地址 标号的用法有两种: ① 在代码段某一指令的前面 , 是当前一条指令语句地址的符号表示 , 用来提供一个转移地址 ,让其他的指令向此指令转移 , 一般的机器指令语句前不需要标号 ② 用来表示过程入口地址 三、标号 汇编语言中的运算符号和表达式 数值表达式是利用算术 、 逻辑 、 移位或关系运算符将常量连结在一起构成的表达式 , 它的运算结果是一个数值 ① 算术运算符共有 +、 、 *、 /、 MOD 5个 ,其中 *、 /、 MOD优先级相同 , +、 优先级相同 ,并且 *、 /、 MOD优先级高于 +、。 可利用括号改变一个表达式某一部分的优先级。 MOD是取余数 ,如 7 MOD 3的值是 1 ② 逻辑运算符有 AND、 OR、 XOR、 NOT 4个 ,分别是逻辑与 、 逻辑或 、 逻辑异或 、 逻辑非。 逻辑运算是按位进行的 , 所以运算的结果仍是整数常量 一、数值表达式 ③ 移位运算符有左移 SHL和右移 SHR 2个运算符。 SHL表示将常量左移运算符右边常量规定的次数 , SHR表示将常量右移运算符右边常量规定的次数 , 所空的位补 0 ④ 关系运算符有 EQ、 NE、 GT、 LT、 GE、LE共 6个运算符 , 分别是等于 、 不等于 、 大于 、小于 、 大于或等于 、 小于或等于。 关系运算的结果是两个特殊的量 , 若关系不成立 , 则结果为 0;否则为 0FFFFH 地址表达式的值是段内偏移地址 , 它具有段 、 偏移地址及类型三个属性。 地址表达式是由变量 、 常量 、 标号 、 寄存器和运算符组成的有意义的式子 地址表达式除可使用数值表达式的运算符外 , 还可根据需要使用一些特殊运算符 二、地址表达式 用来指明某个变量 、 标号或地址表达式的类型属性 , 或者使它临时兼有与原定义所不同的类型属性 , 但保持它们原来的段属性和偏移地址属性不变。 其格式是: 类型 PTR 地址表达式 根据地址表达式的不同值 , 类型可以是 BYTE、 WORD、 DWORD、 NEAR、FAR 1.类型运算符 PTR 为了将源程序中的指令正确地翻译成目标代码 ,汇编程序要求每个语句中操作数的类型要明确 , 如果是双操作数指令 , 还要求源操作数和目的操作数类型一致 , 既同时为字节类型或同时为字类型。 下面分 4种情况说明: ① 对于单操作数指令 , 操作数的类型必须明确 ② 对于双操作数指令 , 只要有一个操作数类型明确就可以了 ③ 如果两个操作数类型都明确 , 则它们的类型必须一致 ④ 如果两个操作数类型都不明确 , 就要用 PTR来指定类型了 跨段前缀 “ :”用于临时给变量 、 标号或地址表达式指定一个段属性 , 且只能在所出现的语句中有效 , 它并不改变地址表达式的偏移地址和类型属性 , 它的格式是: ① 段寄存器名:地址表达式 , ② 段名:地址表达式 MOV AX, [SI]等价于 MOV AX, DS:[SI], 默认从数据段中取数据。 若改为 MOV AX, ES:[SI], 则从附加数据段中取数据 2.跨段前缀 “ :” 属性分离运算符可分离出变量、标号的段、偏移地址及类型的属性值。 其格式是:分离运算符 变量或标号,运算结果是一个数值常量 3. 属性分离运算符 ① 段属性分离运算符 SEG。 该运算符分离出其后变量或标号所在段的首地址 ② 偏移属性分离运算符 OFFSET。 该运算符分离出其后变量或标号的偏移地址 ③ 类型分离运算符 TYPE 该运算符取其后变量或标号的类型。 如果是变量 ,其类型值由变量的类型确定 , 某一变量类型的类型值和该变量在内存中所占的字节数相同 ① 取变量所含的数据存储单元个数运算符LENGTH, 格式: LENGTH 变量。 它的取值根据定义该变量时 , 数据定义伪指令后面第一个表达式的形式而定 , 如果第一个表达式为重复子句 “ n DUP( 表达式 ) ” , 则取值为前面的重复因子 n,如果为其他形式的表达式 , 则取值为 1 ② 取变量所含的数据存储区大小运算符 SIZE,格式: SIZE 变量。 它的取值为: LENGTH变量 * TYPE 变量 , 也就是说 , 它的取值是一个变量所占内存的实际字节数 ③ 字节分离运算符 HIGH和 LOW 格式: HIGH 常量或地址表达式; LOW 常量或地址表达式 其中 , HIGH分离出其后常量或地址表达式的高 8位 ,LOW分离出其后常量或地址表达式的低 8位。 汇编语言中的常用的运算符的优先级见表 417。 顺序与分支程序的设计 顺序型结构程序的特征是在程序的指令中无转移指令 , 计算机从程序的第一条指令开始顺序执行 , 直到程序的最后一条指令为止 例 【 429】 在一个表中存放着 0到 9十个数字的立方值 ,编程从键盘输入 0到9之间的任意一个数 ,查表找出这个数的立方值 顺序与分支程序的设计 有分支控制的程序结构称为分支型结构 ( 或称选择结构 )。 分支型结构可分为二分支型结构和多分支型结构。 在分支程序中 , 不同的条件往往是通过标志寄存器中条件标志的不同状态反映的。 因此分支程序设计中一个至关重要的问题是根据各标志的不同状态选用合适的转移指令。 转移指令分条件转移指令和无条件转移指令两大类 一、条件转移 语句格式: [标号 :]操作符 短标号 功能:如果条件满足,则 (IP)+位移量→ IP 顺序与分支程序的设计 在转移指令中 , 位移量为当前 (IP)到转移目的地址处的字节距离。 如果当前 (IP)到某标号 (即转移的目的地址 )的位移量在 128~ 127之间 , 则该标号称为短标号。 当位移量为正时 , 表示向前转;当位移量为负时 , 表示向后转 , 条件转移指令的目的地址均是短标号 条件转移指令共有 18条,分成以下三类 1.简单条件转移指令 共有 10条,根据单个标志的状态决定是否转移 共有 4条 , 根据多个标志的状态决定是否转移 , 这类指令将比较对象视为无符号数 共有 4条 , 根据多个标志的状态决定是否转移 ,这类指令将比较对象视为带符号数 顺序与分支程序的设计 二 、 无条件转移 无条件转移指令使 CPU无条件地转移到指令中指明的目的地址处执行 , 在程序中用它将各分支的出口重新汇集到一起构成多分支结构 , 特别是当条件转移指令的转移范围超过 128~ 127个字节时 , 往往要借助无条件转移指令实现 顺序与分支程序的设计 无条件转移指令和要转移的目的地址可以在同一段 , 也可以在另一段。 前者称为段内转移 , 后者称为段间转移。 段内转移指令只改变指令指针 IP的内容 , 而段间转移指令则要同时改变指令指针 IP和代码段寄存器的内容。 无条件转移指令可通过各种寻址方式得到要转移的目的地址 , 常用的有直接寻址和间接寻址两种 , 表 418列出了无条件转移指令的格式和功能说明 无条件转移指令和条件转移指令有两点重要区别:一是前者的转移是无条件的,不做任何判断便转向目的单元;二是前者的转移范围不受限制,而后者只能在 128~ 127个字节范围内转移 顺序与分支程序的设计 例 【 430】 编程实现符号函数 例【4 3 0 】程序 顺序与分支程序的设计 对于多路分支的程序 , 如果直接用条件转移指令实现 , 那么 N路分支 , 就需要 N1条条件转移指令 , 程序显得冗长繁琐 , 可用跳转表来实现。
阅读剩余 0%
本站所有文章资讯、展示的图片素材等内容均为注册用户上传(部分报媒/平媒内容转载自网络合作媒体),仅供学习参考。 用户通过本站上传、发布的任何内容的知识产权归属用户或原始著作权人所有。如有侵犯您的版权,请联系我们反馈本站将在三个工作日内改正。