资源描述
1/21汇编指令汇编指令处理器的指令集可以分为跳转指令、数据处理指令、程序状态寄存器()处理指令、加载存储指令、协处理器指令和异常产生指令大指令。一、跳转指令跳转指令用于实现程序流程的跳转,在程序中有以下两种方法可以实现程序流程的跳转。.使用专门的跳转指令;.直接向程序计数器写入跳转地址值,通过向程序计数器写入跳转地址值,可以实现在的地址空间中的任意跳转,在跳转之前结合使用,等类似指令,可以保存将来的返回地址值,从而实现在连续的线性地址空间的子程序调用。指令集中的跳转指令可以完成从当前指令向前或向后的的地址空间的跳转,包括以下条指令:、指令指令的格式为:条件 目标地址指令是最简单的跳转指令。一旦遇到一个指令,处理器将立即跳转到给定的目标地址,从那里继续执行。注意存储在跳转指令中的实际值是相对当前 值的一个偏移量,而不是一个绝对地址,它的值由汇编器来计算(参考寻址方式中的相对寻址)。它是位有符号数,左移两位后有符号扩展为 位,表示的有效偏移为 位(前后的地址空间)。以下指令:;程序无条件跳转到标号处执行,;当寄存器中的条件码置位时,程序跳转到标号处执行 、指令指令的格式为:条件 目标地址是另一个跳转指令,但跳转之前,会在寄存器中保存的当前内容,因此,可以通过将的内容重新加载到中,来返回到跳转指令之后的那个 指令处执行。该指令是实现子程序调用的一个基本但常用的手段。以 下指令:;当程序无条件跳转到标号处执行时,同时将当前的 值保存到;()中、指令指令的格式为:目标地址指令从指令集跳转到指令中所指定的目标地址,并将处理器的工作状态有状态切换到状态,该指令同时将的当前内容保存到寄存 器中。因此,当子程序使用指令集,而调用者使用指令集时,可以通过指令实现子程序的调用和处理器工作状态的切换。同时,子程 序的返回可以通过将寄存器值复制到中来完成。、指令指令的格式为:条件 目标地址 指令跳转到指令中所指定的目标地址,目标地址处的指令既可以是指令,也可以是指令。2/21二、数据处理指令数据处理指令可分为数据传送指令、算术逻辑运算指令 和比较指令等。数据传送指令用于在寄存器和存储器之间进行数据的双向传输;算术逻辑运算指令完成常用的算术与逻辑的运算,该类指令不但将运算结果保存在目的寄存器中,同时更新中的相应条件标志位;比较指令不保存运算结果,只更新中相应的条件标志位。数据处理指令共以下条。、指令(传送)指令的格式为:条件 目的寄存器,源操作数 指令可完成从另一个寄存器、被移位的寄存器或将一个立即数加载到目的寄存器。其中选项决定指令的操作是否影响中条件标志位的值,当没有 时指令不更新中条件标志位的值。指令示例:,;将寄存器的值传送到寄存器,;将寄存器的值传送到,常用于子程序返回,;将寄存器的值左移位后传送到、指令(求反)指令的格式为:条件 目的寄存器,源操作数指令可完成从另一个寄存器、被移位的寄存器、或将一个立即数加载到目的寄存器。与指令不同之处是在传送之前按位被取反了,即把一个被取反的值 传送到目的寄存器中。其中决定指令的操作是否影响中条件标志位的值,当没有时指令不更新中条件标志位的值。指令示例:,;将 立即数取反传送到寄存器中,完成后、指令(比较)指令的格式为:条件 操作数,操作数指令用于把一个寄存器的内容和另一个寄存器的内容或立即数进行比较,同时更新中条件标志位的值。该指令进行一次减法运算,但不存储结果,只 更改条件标志位。标志位表示的是操作数与操作数的关系(大、小、相等),例如,当操作数大于操作操作数,则此后的有后缀的指令将可以执行。指令示例:,;将寄存器的值与寄存器的值相减,并根据 结果设置的标 ;志位,;将寄存器的值与立即数相减,并根 据结果设置的标志位、指令(负数比较)指令的格式为:条件 操作数,操作数指令用于把一个寄存器的内容和另一个寄存器的内容或立即数取反后进行比较,同时更新中条件标志位的值。该指令实际完成操作数和操作数相 加,并根据结果更改条件标志位。指令示例:,;将寄存器的值与寄存器的值相加,并根据 结果设置;的标志位,;将寄存器的值与立即数相加,并根据 结果设置的标志位3/21、指令(测试)指令的格式为:条件 操作数,操作数指令用于把一个寄存器的内容和另一个寄存器的内容或立即数进行按位的与运算,并根据运算结果更新中条件标志位的值。操作数是要测试的数 据,而操作数是一个位掩码,该指令一般用来检测是否设置了特定的位。指令示例:,;用于测试在寄存器中是否设置了最低位(表 示二进制数),;将寄存器的值与立即数按位与,并根据 结果设置;的标志位、指令(测试相等)指令的格式为:条件 操作数,操作数指令用于把一个寄存器的内容和另一个寄存器的内容或立即数进行按位的异或运算,并根据运算结果更新中条件标志位的值。该指令通常用于比较操作数和操作数是否相等。指令示例:,;将寄存器的值与寄存器的值按位异或,并根据结果 设置;的标志位、指令(相加)指令的格式为:条件 目的寄存器,操作数,操作数指令用于把两个操作数相加,并将结果存放到目的寄存器中。操作数应是一个寄存器,操作数可以是一个寄存器,被移位的寄存器,或一个立即数。指令示例:,;,;,;()、指令(带进位相加)指令的格式为:条件 目的寄存器,操作数,操作数指令用于把两个操作数相加,再加上中的条件标志位的值,并将结果存放到目的寄存器中。它使用一个进位标志位,这样就可以做比位大的数 的加法,注意不要忘记设置后缀来更改进位标志。操作数应是一个寄存器,操作数可以是一 个寄存器,被移位的寄存器,或一个立即数。以下指令序列完成两个位数的加法,第一个数由高到低存放在寄存器,第二个数由高到低存放在寄存器,运算结果由高到低存放在寄 存器:,;加低端的字 ,;加第二个字,带进位 ,;加第三个字,带进位 ,;加第四个字,带进位、指令(相减)指令的格式为:条件 目的寄存器,操作数,操作数指令用于把操作数减去操作数,并将结果存放到目的寄存器中。操作数应是一个寄存器,4/21操作数可以是一个寄存器,被移位的寄存器,或一个立即 数。该指令可用于有符号数或无符号数的减法运算。指令示例:,;,;,;()、指令指令的格式为:条件 目的寄存器,操作数,操作数指令用于把操作数减去操作数,再减去中的条件标志位的反码,并将结果存放到目的寄存器中。操作数应是一个寄存器,操作数可以 是一个寄存器,被移位的寄存器,或一个立即数。该指令使用进位标志来表示借位,这样就可以做大于位的减法,注意不要忘记设置后缀来更改进位标志。该指令可用于有符号数或无符号数的减法运算。指令示例:,;!,并根据结果设置的进位标志位、指令指令的格式为:条件 目的寄存器,操作数,操作数指令称为逆向减法指令,用于把操作数减去操作数,并将结果存放到目的寄存器中。操作数应是一个寄存器,操作数可以是一个寄存器,被移位 的寄存器,或一个立即数。该指令可用于有符号数或无符号数的减法运算。指令示例:,;,;,;()、指令(反向带进位减)指令的格式为:条件 目的寄存器,操作数,操作数指令用于把 操作数减去操作数,再减去中的条件标志位的反码,并将结果存放到目的寄存器中。操作数应是一个寄存器,操作数可以是一个寄存器,被移位 的寄存器,或一个立即数。该指令使用进位标志来表示借位,这样就可以做大于位的减法,注意不要忘记设置后缀来更改进位标志。该指令可用于有符号数或 无符号数的减法运算。指令示例:,;!、指令(逻辑位 与)指令的格式为:条件 目的寄存器,操作数,操作数指令用于在两个操作数上进行逻辑与运算,并把结果放置到目的寄存器中。操作数应是一个寄存器,操作数可以是一个寄存器,被移位的寄存器,或一个 立即数。该指令常用于屏蔽操作数的某些位。指令示例:,;该指令保持的、位,其余位清零。、指令(逻辑位 或)指令的格式为:5/21 条件 目的寄存器,操作数,操作数指令用于在两个操作数上进行逻辑或运算,并把结果放置到目的寄存器中。操作数应是一个寄存器,操作数可以是一个寄存器,被移位的寄存器,或一个 立即数。该指令常用于设置操作数的某些位。指令示例:,;该指令设置的、位,其余位保持不变。、指令(逻辑位 异或)指令的格式为:条件 目的寄存器,操作数,操作数指令用于在两个操作数上进行逻辑异或运算,并把结果放置到目的寄存器中。操作数应是一个寄存器,操作数可以是一个寄存器,被移位的寄存器,或一 个立即数。该指令常用于反转操作数的某些位。指令示例:,;该指令反转的、位,其余位保持不变。、指令(位清零)指令的格式为:条件 目的寄存器,操作数,操作数指令用于清除操作数的某些位,并把结果放置到目的寄存器中。操作数应是一个寄存器,操作数可以是一个寄存器,被移位的寄存器,或一个立即数。操作数为位的掩码,如果在掩码中设置了某一位,则清除这一位。未设置的掩码位保持不 变。指令示例:,;该指令清除中的位、和,其余的位保持不变。三、乘法指令与乘加指令 微处理器支持的乘法指令与乘加指令共有条,可分为运算结果为位和运算结果为位两类,与前面的数据处理指令不同,指令中的所有操作数、目的寄存器 必须为通用寄存器,不能对操作数使用立即数或被移位的寄存器,同时,目的寄存器和操作数必须是不同的寄存器。乘法指令与乘加指令共有以下条:、指令(相乘)指令的格式为:条件 目的寄存器,操作数,操作数指令完成将操作数与操作数的乘法运算,并把结果放置到目的寄存器中,同时可以根据运算结果设置中相应的条件标志位。其中,操作数和操 作数均为位的有符号数或无符号数。指令示例:,;,;,同时设置中的相关条件标志位、指令(带累加的相乘)指令的格式为:条件 目的寄存器,操作数,操作数,操作数指令完成将操作数与操作数的乘法运算,再将乘积加上操作数,并把结果放置到目的寄存器中,同时可以根据运算结果设置中相应的条件标志 位。其中,操作数和操作数均为位的有符号数或无符号数。指令示例:6/21 ,;,;,同时设置中的相关条件标志位、指令指令的格式为:条件 目的寄存器,目的寄存器,操作数,操作数指令完成将操作数与操作数的乘法运算,并把结果的低位放置到目的寄存器中,结果的高位放置到目的寄存器中,同时可以 根据运算结果设置中相应的条件标志位。其中,操作数和操作数均为位的有符号数。指令示例:,;()的低位 ;()的高位、指令指令的格式为:条件 目的寄存器,目的寄存器,操作数,操作数指令完成将操作数与操作数的乘法运算,并把结果的 低位同目的寄存器中的值相加后又放置到目的寄存器中,结果的高位同目的寄存器中的值相加后又放置到目的寄存器中,同 时可以根据运算结果设置中相应的条件标志位。其中,操作数和操作数均为位的有符号数。对于目的寄存器,在指令执行前存放位加数的低位,指令执行后存放结果的低位;对于目的寄存器,在指令执行前存放位加数的高位,指令执行后存放结果的高位。指令示例:,;()的低位 ;()的高位 、指令指令的格式为:条件 目的寄存器,目的寄存器,操作数,操作数指令完成将操作数与操作数的乘法运算,并把结果的低位放置到目的寄存器中,结果的高位放置到目的寄存器中,同时可以 根据运算结果设置中相应的条件标志位。其中,操作数和操作数均为位的无符号数。指令示例:,;()的低位 ;()的高位、指令指令的格式为:条件 目的寄存器,目的寄存器,操作数,操作数指令完成将操作数与操作数的乘法运算,并把结果的 低位同目的寄存器中的值相加后又放置到目的寄存器中,结果的高位同目的寄存器中的值相加后又放置到目的寄存器 中,同 时可以根据运算结果设置中相应的条件标志位。其中,操作数和操作数均为位的无符号数。对于目的寄存器,在指令执行前存放位加数的低位,指令执行后存放结果的低位;对于目的寄存器,在指令执行前存放位加数的高位,指令执行后存放结果的高位。指令示例:,;()的低位 ;()的高位 四、程序状态寄存器访问指令7/21、指令指令的格式为:条件 通用寄存器 程序状态寄存器(或)指令用于将程序状态寄存器的内容传送到通用寄存器中。该指令一般用在以下两种情况:.当需要改变程序状态寄存器的内容时,可用将程序状态寄存器的内容读入通用寄存器,修改后再写回程序状态寄存器。.当在异常处理或进程切换时,需要保存程序状态寄存器的值,可先用该指令读出程序状态寄存器的值,然后保存。指令示例:,;传送的内容到,;传送 的内容到、指令指令的格式为:条件 程序状态寄存器(或),操作数指令用于将操作数的内容传送到程序状态寄存器的特定域中。其中,操作数可以为通用寄存器或立即数。用于设置程序状态寄存器中需要 操作的位,位的程序状态寄存器可分为个域:位:为条件位域,用表示;位:为状态位域,用表示;位:为扩展位域,用表示;位:为控制位域,用表示;该指令通常用于恢复或改变程序状态寄存器的内容,在使用时,一般要在指令中指明将要操作的域。指令示例:,;传送的内容到,;传送的内容到,;传送的内容到,但仅仅修改中的控制位域五、加载存储指令。微处理器支持加载存储指令用于在寄存器和存储器之间传送数据,加载指令用于将存储器中的数据传送到寄存器,存储 指令则完成相反的操作。常用的加载存储指令如下:、指令指令的格式为:条件 目的寄存器,指令用于从存储器中将一个位的字数据传送到目的寄存器中。该指令通常用于从存储器中读取位的字数据到通用寄存器,然后对数据进行处理。当程序计数器作为 目的寄存器时,指令从存储器中读取的字数据被当作目的地址,从而可以实现程序流程的跳转。该指令在程序设计 中比较常用,且寻址方式灵活多样,请读者认真掌握。指令示例:,;将存储器地址为的字数据读入寄存器。,;将存储器地址为的字数据读入寄存器。,;将存储器地址为的字数据读入寄存器。,!;将存储器地址为的字数据读入寄存器,并将新地 址;写入。,!;将存储器地址为的字数据读入寄存器,并将新地址 8/21;写入。,;将存储器地址为的字数据读入寄存器,并将新地址;写入。,!;将存储器地址为的字数据读入寄存器,并;将新地址写入。,;将存储器地址为的字数据读入 寄存器,并将新地;址写入。、指令指令的格式为:条件 目的寄存器,指令用于从存储器中将一个位的字节数据传送到目的寄存器中,同时将寄存器的高位清零。该指令通常用于从存储器中读取位的字节数据到通用寄存器,然后对数据进行处理。当程序计数器作为目的寄存器时,指令从存储器中读取的字数据被当作目 的地址,从而可以实现程序流程的跳转。指令示例:,;将存储器地址为的字节数据读入寄存器,并将的高 ;位清零。,;将存储器地址为的字节数据读入寄存器,并将 的;高位清零。、指令指令的格式为:条件 目的寄存器,指令用于从存储器中将一个位的半字数据传送到目的寄存器中,同时将寄存器的高位清零。该指令通常用于从存储器中读取位的半字数据到通用寄存器,然后对数据进行处理。当程序计数器作为目的寄存器时,指令从存储器中读取的字数据被当作 目的地址,从而可以实现程序流程的跳转。指令示例:,;将存储器地址为的半字数据读入寄存器,并将的高;位清零。,;将存储器地址为的半字数据读入寄存器,并将 的;高位清零。,;将存储器地址为的半字数据读入寄存器,并将 的;高位清零。、指令指令的格式为:条件 源寄存器,指令用于从源寄存器中将一个位的字数据传送到存储器中。该指令在程序设计中比较常用,且寻址方式灵活多样,使用方式可参考指令。指令示例:,;将中的字数据写入以为地址的存储器中,并 将新地址;写入。,;将中的字数据写入以为地址的存储器中。、指令指令的格式为:9/21 条件 源寄存器,指令用于从源寄存器中将一个位的字节数据传送到存储器中。该字节数据为源寄存器中的低位。指令示例:,;将寄存器中的字节数据写入以为地 址的存储器中。,;将寄存器中的字节数据写入以为地址的存 储器中。、指令指令的格式为:条件 源寄存器,指令用于从源寄存器中将一个位的半字数据传送到存储器中。该半字数据为源寄存器中的低位。指令示例:,;将寄存器中的半字数据写入以为地址的 存储器中。,;将寄存器中的半字数据写入以 为地址的存储器中。六、批量数据加载存储指令。微处理器所支持批量数据加载存储指令可以一次在一片连续的存储器单元和多个寄存器之间传送数据,批量加载指令 用于将一片连续的存储器中的数据传送到多个寄存器,批量数据存储指令则完成相反的操作。常用的加载存储指令如下:(或)指令 (或)指令的格式为:(或)条件类型 基址寄存器!,寄存器列表(或)指令用于从由基址寄存器所指示的一片连续存储器到寄存器列表所指示的多个寄存器之间传送数据,该指令的常见用途是将多个寄存器的内容入栈或出栈。其中,类型为 以下几种情况:每次传送后地址加;每次传送前地址加;每次传送后地址减;每次传送前地址减;满递减堆栈;空递减堆栈;满递增堆栈;空递增堆栈;!为可选后缀,若选用该后缀,则当数据 传送完毕之后,将最后的地址写入基址寄存器,否则基址寄存器的内容不改变。基址寄存器不允许为,寄存器列表可以为的任意组合。为可选后缀,当指令为且寄存器列表中包含,选用该后缀时表示:除了正常的数据传送之外,还将复制到。同时,该后缀还表 示传入或传出的是用户模式下的寄存器,而不是当前模式下的寄存器。指令示例:!,;将寄存器列表中的寄存器(,到,)存入堆栈。!,;将堆栈内容恢复到寄存器(,到,)。七、数据交换指令、指令10/21指令的格式为:条件 目的寄存器,源寄存器,源寄存器指令用于将源寄存器所指向的存储器中的字数据传送到目的寄存器中,同时将源寄存器中的字数据传送到源寄存器所指向的存储器中。显然,当源寄存 器和目的寄存器为同一个寄存器时,指令交换该寄存器和存储器的内容。指令示例:,;将所指向的存储器中的字数据传送到,同时将 中的字数据传送到所指向的存储单元。,;该指令完成将所指向的存储器中的字数 据与中的数据交换。、指令指令的格式为:条件 目的寄存器,源寄存器,源寄存器指令用于将源寄存器所指向的存储器中的字节数据传送到目的寄存器中,目的寄存器的高清零,同时将源寄存 器中的字节数据传送到源寄存器所指向的存储器中。显然,当源寄存器和目的寄存器为同一个寄存器时,指令交换该寄存器和存储器的内容。指令示例:,;将所指向的存储器中的字节数据传送到,的高位清零,同时将中的低位数据传送到所指向的存储单元。,;该指令完成将所指向的存储器中的 字节数据与中的低位数据交换。八、移位指令、(或)(或)的格式为:通用寄存器,(或)操作数 (或)可完成对通用寄存器中的内容进行逻辑(或算术)的左移操作,按操作数所指定的数量向左移位,低位用零来填充。其中,操作数可以是通用寄存器,也可以是立即数()。操作示例 ,;将中的内容左移两位后传送到 中。、的格式为:通用寄存器,操作数 可完成对通用寄存器中的内容进行右移的操作,按操作数所指定的数量向右移位,左端用零来填充。其中,操作数可以 是通用寄存器,也可以是立即数()。操作示例:,;将中的内容右移两位后传送到 中,左端用零来填充。、的格式为:通用寄存器,操作数 可完成对通用寄存器中的内容进行右移的操作,按操作数所指定的数量向右移位,左端用第位的值来填充。其中,操作数可以是通用寄存器,也可以是立 即数()。操作示例:,;将中的内容右移两位后传送到 中,左端用第位的值来填充。、的格式为:11/21通用寄存器,操作数 可完成对通用寄存器中的内容进行循环右移的操作,按操作数所指定的数量向右循环移位,左端用右端移出的位来填充。其中,操作数可以是通用寄存器,也 可以是立即数()。显然,当进行位的循环右移操作时,通用寄存器中的值不改变。操作示例:,;将中的内容循环右移两位后传送到 中。、的格式为:通用寄存器,操作数 可完成对通用寄存器中的内容进行带扩展的循环右移的操作,按操作数所指定的数量向右循环移位,左端用进位标志位来填充。其中,操作数可以是通用寄 存器,也可以是立即数()。操作示例:,;将中的内容进行带扩展的循环右移两位 后传送到中。九、协处理器指令、指令指令的格式为:条件 协处理器编码,协处理器操作码,目的寄存器,源寄存器,源寄存器,协处理器操作码。指令用于处理器通知协处理器执行特定的操作,若协处理器不能成功完成特定的操作,则产生未定义指令异常。其中协处理器操作码和协处理 器操作码为协处理器将要执行的操作,目的寄存器和源寄存器均为协处理器的寄存器,指令不涉及处理器的寄存器和存储器。指令示例:,;该指令完成协处理器的初始化、指令指令的格式为:条件 协处理器编码,目的寄存器,源寄存器指令用于将源寄存器所指向的存储器中的字数据传送到目的寄存器中,若协处理器不能成功完成传送操作,则产生未定义指令异常。其中,选项表示指 令为长读取操作,如用于双精度数据的传输。指令示例:,;将处理器的寄存器所指向的存储器中的字数 据传送到协处理器的寄存器中。、指令指令的格式为:条件 协处理器编码,源寄存器,目的寄存器指令用于将源寄存器中的字数据传送到目的寄存器所指向的存储器中,若协处理器不能成功完成传送操作,则产生未定义指令异常。其中,选项表示指 令为长读取操作,如用于双精度数据的传输。指令示例:,;将协处理器的寄存器中的字数据传送到处理 器的寄存器所指向的存储器中。、指令指令的格式为:12/21条件 协处理器编码,协处理器操作码,源寄存器,目的寄存器,目的寄存器,协处理器操作码。指令用于将处理器寄存器中的数据传送到协处理器寄存器中,若协处理器不能成功完成操作,则产生未定义指令异常。其中协处理器操作码和协处理 器操作码为协处理器将要执行的操作,源寄存器为处理器的寄存器,目的寄存器和目的寄存器均为协处理器的寄 存器。指令示例:,;将处理器寄存器中的数据传送到协处 理器的寄存器和中。、指令指令的格式为:条件 协处理器编码,协处理器操作码,目的寄存器,源寄存器,源寄存器,协处理器操作码。指令用于将协处理器寄存器中的数据传送到处理器寄存器中,若协处理器不能成功完成操作,则产生未定义指令异常。其中协处理器操作码和协处理 器操作码为协处理器将要执行的操作,目的寄存器为处理器的寄存器,源寄存器和源寄存器均为协处理器的寄存器。指令示例:,;该指令将协处理器的寄存器中的数据传送到 处理器寄存器中。十、异常产生指令、指令指令的格式为:条件 位的立即数指令用于产生软件中断,以便用户程序能调用操作系统的系统例程。操作系统在的异常处理程序中提供相应的系统服务,指令中位的立即数指定用 户程序调用系统例程的类型,相关参数通过通用寄存器传递,当指令中位的立即数被忽略时,用户程序调用系统例程的类型由通用寄存器的内容决定,同 时,参数通过其他通用寄存器传递。指令示例:;该指令调用操作系统编号位的系统例程。、指令指令的格式为:位的立即数指令产生软件断点中断,可用于程序的调试。汇编伪指令在汇编语言程序里,有一些特殊指令助记符,这些助记符与指令系统的助记符不同,没有相对应的操作码,通常称这些特殊指令助记符为伪指令,他们所完成 的操作称为伪操作。伪指令在源程序中的作用是为完成汇编程序作各种准备工作的,这些伪指令仅在汇编过程中起作用,一旦汇编结束,伪指令的使命就完 成。在 的汇编程序中,有如下几种伪指令:符号定义伪指令、数据定义伪指令、汇编控制伪指令、宏指令以及其他伪指令。一、符号定义()伪指令 符号定义伪指令用于定义 汇编程序中的变量、对变量赋值以及定义寄存器的别名等操作。常见的符号定义伪指令有如下几种:用于定义全局变量的、和。用于定义局部变量的、和。用于对变量赋值的、。13/21 为通用寄存器列表定义名称的。、和 语法格式:(或)全局变量名 、和 伪指令用于定义一个 程序中的全局变量,并将其初始化。其中:伪指令用于定义一个全局的数字变量,并初始化为;伪指令用于定义一个全局的逻辑变量,并初始化为(假);伪指令用于定义一个全局的字符串变量,并初始化为空;由于以上三条伪指令用于定义全局变量,因此在整个程序范围内变量名必须唯一。使用示例:;定义一个全局的数字变量,变量名为。;将该变量赋值为。;定义一个全局的逻辑变量,变量名为。;将该变量赋值为真。;定义一个全局的字符串变量,变量名为。“”;将该变量赋值为”。、和 语法格式:(或 )局部变量名 、和 伪指令用于定义一个 程序中的局部变量,并将其初始化。其中:伪指令用于定义一个局部的数字变量,并初始化为;伪指令用于定义一个局部的逻辑变量,并初始化为(假);伪指令用于定义一个局部的字符串变量,并初始化为空;以上三条伪指令用于声明局部变量,在其作用范围内变量名必须唯一。使用示例:;声明一个局部的数字变 量,变量名为。;将该变量赋值为。;声明一个局部的逻辑变 量,变量名为。;将该变量赋值为真。;定义一个局部的字 符串变量,变量名为。“”;将该变量赋值为”。、和 语法格式:变量名 (或 )表达式 伪指令 、用于给一个已经定义的全局变量或局部变量赋值。伪指令用于给一个数学变量赋值;伪指令用于给一个逻辑变量赋值;伪指令用于给一个字符串变量赋值;其中,变量名为已经定义过的全局变量或局部变量,表达式为将要赋给变量的值。使用示例:;声明一个局部的数字变量,变量名为。;将该变量赋值为。14/21 ;声明一个局部的逻辑变量,变量名为。;将该变量赋值为真。、语法格式:名称 寄存器列表 伪指令可用于对一个通用寄存器列表定义名称,使用该伪指令定义的名称可在 指令 中使用。在指令中,列表中的寄存器访问次序为根据寄存器的编号由低到高,而与列表中的寄存器排列次序无关。使用示例:,;将寄存器列表名称定义为 ,可在指令中通过该名称访问寄存器列表。二、数据定义()伪指令 数据定义伪指令一般用于为特定的数据分配存储单元,同时可完成已分配存储单元的初始化。常见的数据定义伪指令有如下几种:用于分配一片连续的字节存储单元并用指定的数据初始化。()用于分配一片连续的半字存储单元并用指定的数据初始化。()用于分配一片连续的字存储单元并用指定的数据初始化。()用于为双精度的浮点数分配一片连续的字存储单元并用指定的数据初始化。()用于为单精度的浮点数分配一片连续的字存储单元并用指定的数据初始化。()用于分配一片以字节为单位的连续的存储单元并用指定的数据初始化。用于分配一片连续的存储单元。用于定义一个结构化的内存表首地址。用于定义一个结构化的内存表的数据域。、语法格式:标号 表达式 伪指令用于分配一片连续的字节存储单元并用伪指令中指定的表达式初始化。其中,表达式可以为的数字或字符串。也可用“”代替。使用示例:“”;分配一片连续的字节存储单元并初始化。、(或)语法格式:标号 (或)表达式 (或)伪指令用于分配一片连续的半字存储单元并用伪指令中指定的表达式初始化。其中,表达式可以为程序标号或数字表达式。用分配的字存储单元是半字对齐的,而用分配的字存储单元并不严格半字对齐。使用示例:,;分配一片连续的半字存储单元并初始化。、(或)语法格式:标号(或)表达式 15/21 (或)伪指令用于分配一片连续的字存储单元并用伪指令中指定的表达式初始化。其中,表达式可以为程序标号或数字表达式。也可 用;”代替。用分配的字存储单元是字对齐的,而用分配的字存储单元并不严格字对齐。使用示例:,;分配一片连续的字存储单元并初始化。、(或)语法格式:标号(或)表达式 (或)伪指令用于为双精度的浮点数分配一片连续的字存储单元并用伪指令中指定的表达式初始化。每个双精度的浮点数占据两个字单元。用 分配的字存储单元是字对齐的,而用分配的字存储单元并不严格字对齐。使用示例:,;分配一片连续的字存储单元并初始化 为指定的双精度数。、(或)语法格式:标号(或)表达式 (或)伪指令用于为单精度的浮点数分配一片连续的字存储单元并用伪指令中指定的表达式初始化。每个单精度的浮点数占据一个字单元。用 分配的字存储单元是字对齐的,而用分配的字存储单元并不严格字对齐。使用示例:,;分配一片连续的字存储单元并初始化为 指定的单精度数。、(或)语法格式:标号(或)表达式 (或)伪指令用于分配一片以个字节(双字)为单位的连续存储区域并用伪指令中指定的表达式 初始化。用分配的存储单元是字对齐的,而用 分配的存储单元并不严格字对齐。使用示例:;分配一片连续的存储单元并初始化为指定的值。、语法格式:标号 表达式 伪指令用于分配一片连续的存储区域并初始化为。其中,表达式为要分配的字节数。也可用“”代替。使用示例:;分配连续字节的存储单元并初始化为。、语法格式:表达式 ,基址寄存器 伪指令用于定义一个结构化的内存表的首地址。也可用“”代替。16/21 表达式可以为程序中的标号或数学表达式,基址寄存器为可选项,当基址寄存器选项不存在时,表达式的值即为内存表的首地址,当该选项存在时,内存表的首地址 为表达式的值与基址寄存器的和。伪指令通常与伪指令配合使用来定义结构化的内存表。使用示例:,;定义结构化内存表首地址的值为。、语法格式:标号 表达式 伪指令用于定义一个结构化内存表中的数据域。也可用“”代替。表达式的值为当前数据域在内存表中所占的字节数。伪指令常与伪指令配合使用来定义结构化的内存表。伪指令定义内存表的首地址,伪指令定义内存表中的各个数据域,并可以为 每个数据域指定一个标号供其他的指令引用。注意和伪指令仅用于定义数据结构,并不实际分配存储单元。使用示例:;定义结构化内存表首地址的值为。;定义的长度为字节,位置为。;定义的长度为字节,位置为。;定义的长度为字节,位置为。三、汇编控制()伪指令 汇编控制伪指令用于控制汇编程序的执行流程,常用的汇编控制伪指令包括以下几条:、语法格式:逻辑表达式 指令序列 指令序列 、伪指令能根据条件的成立与否决定是否执行某个指令序列。当后面的逻辑表达式为真,则执行指令序列,否则执行指令序列。其中,及指令序列可以没有,此时,当后面的逻辑表达式为真,则执行指令序列,否则继续执行后面的指令。、伪指令可以嵌套使用。使用示例:;声明一个全局的逻辑变量,变量名为 指令序列 指令序列 17/21、语法格式:逻辑表达式 指令序列 、伪指令能根据条件的成立与否决定是否循环执行某个指令序列。当后面的逻辑表达式为真,则执行指令序列,该指令序列执行完毕后,再判断 逻辑表达式的值,若为真则继续执行,一直到逻辑表达式的值为假。、伪指令可以嵌套使用。使用示例:;声明一个全局的数学变量,变量名为 ;由变量 控制循环次数 ;指令序列 、语法格式:$标号 宏名$参数 ,$参数 ,指令序列 、伪指令可以将一段代码定义为一个整体,称为宏指令,然后就可以在程序中通过宏指令多次调用该段代码。其中,$标号在宏指令被展开时,标号会被替 换为用户定义的符号,宏指令可以使用一个或多个参数,当宏指令被展开时,这些参数被相应的值替换。宏指令的使用方式和功能与子程序有些相似,子程序可以提供模块化的程序设计、节省存储空间并提高运行速度。但在使用子程序结构时需要保护现场,从而增加了 系统的开销,因此,在代码较短且需要传递的参数较多时,可以使用宏指令代替子程序。包含在和之间的指令序列称为宏定义体,在宏定义体的第一行应声明宏的原型(包含宏名、所需的参数),然后就可以在汇编程序中通过宏名来 调用该指令序列。在源程序被编译时,汇编器将宏调用展开,用宏定义中的指令序列代替程序中的宏调用,并将实际参数的值传递给宏定义中的形式参数。、伪指令可以嵌套使用。、语法格式:用于从宏定义中跳转出去。四、其他常用的伪指令 还有一些其他的伪指令,在汇编程序中经常会被使用,包括以下几条:、18/21 (或)(或)、语法格式:段名 属性,属性,伪指令用于定义一个代码段或数据段。其中,段名若以数字开头,则该段名需用“”括起来,如:。属性字段表示该代码段(或数据段)的相关属性,多个属性用逗号分隔。常用的属性如下:属性:用于定义代码段,默认为。属性:用于定义数据段,默认为。属性:指定本段为只读,代码段默认为。属性:指定本段为可读可写,数据段的默认属性为。属性:使用方式为表达式。在默认时,(可执行连接文件)的代码段和数据段是按字对齐的,表达式的取值范围为,相应的对齐方式为 表达式次方。属性:该属性定义一个通用的段,不包含任何的用户代码和数据。各源文件中同名的段共享同一段存储单元。一个汇编语言程序至少要包含一个段,当程序太长时,也可以将程序分为多个代码段和数据段。使用示例:,;该伪指令定义了一个代码段,段 名为,属性为只读。、语法格式:表达式 ,偏移量 伪指令可通过添加填充字节的方式,使当前位置满足一定的对齐方式。其中,表达式的值用于指定对齐方式,可能的取值为的幂,如、等。若未指定表达式,则将当前位置对齐到下一个字的位置。偏移量也为一个数字表达式,若使用该字段,则当前位置的对齐方式为:的表达式次幂偏移 量。使用示例:,;指定后面的指令为 字节对齐。指令序列 、语法格式:(或)19/21 伪指令通知编译器,其后的指令序列为位的指令。伪指令通知编译器,其后的指令序列为位的指令。若在汇编源程序中同时包含指令和指令时,可用伪指令通知编译器其后的指令序列为位的指令,伪指令 通知编译器其后的指令序列为位的指令。因此,在使用指令和指令混合编程的代码里,可用这两条伪指令进行切换,但注意他们只通知 编译器其后指令的类型,并不能对处理器进行状态的切换。使用示例:,;通知编译器其后的指令为位的 指令 ,;将跳转地址放入寄存器 ;程序跳转到新的位置执行,并将处理器切换到工作状态 ;通知编译器其后的指令为位的 指令 ,;、语法格式:伪指令用于指定汇编程序的入口点。在一个完整的汇编程序中至少要有一个(也可以有多个,当有多个时,程序的真正入口点由链 接器指定),但在一个源文件里最多只能有一个(可以没有)。使用示例:,;指定应用程序的入口点 、语法格式:伪指令用于通知编译器已经到了源程序的结尾。使用示例:,;指定应用程序的结尾 、语法格式:名称 表达式 ,类型 伪指令用于为程序中的常量、标号等定义一个等效的字符名称,类似于语言中的。其中可用“*”代替。名称为伪指令定义的字符名称,当表达式为位的常量时,可以指定 表达式的数据类型,可以有以下三种类型:、和 使用示例:20/21 ;定义标号 的值为。,;定义的值为,且该处为位的指令。、(或)语法格式:标号 伪指令用于在程序中声明一个全局的标号,该标号可在其他的文件中引用。可用代替。标号在程序中区分大小写,选项声明其他的同名标号优先于该标号被引用。使用示例:,;声明一个可全局引用的标号 、语法格式:标号 伪指令用于通知编译器要使用的标号在其他的源文件中定义,但要在当前源文件中引用,而且无论当前源文件是否引用该标号,该标号均会被加入到当前源文件的符号表中。标 号在程序中区分大小写,选项表示当所有的源文件都没有定义这样一个标号时,编译器也不给出错误信息,在多数情况下将该标号置为,若该标号为或指令引用,则将或指令置为操作。使用示例:,;通知编译器当前文件要引用标号,但在其他源文件中定 义。、语法格式:标号 伪指令用于通知编译器要使用的标号在其他的源文件中定义,但要在当前源文件中引用,如果当前源文件实际并未引用该标号,该 标号就不会被加入到当前源文件的符号表中。标号在程序中区分大小写,选项表示当所有的源文件都没有定义这样一个标号时,编译器也不给出错误信息,在多数情况下将该标号置为,若该标号为或指令引用,则将或指令置为操作。使用示例:,;通知编译器当前文件要引用标号,但在其他源文件中定 义。、(或)语法格式:文件名 伪指令用于将一个源文件包含到当前的源文件中,并将被包含的源文件在当前位置进行汇编处理。可 以使用代替。汇编程序中常用的方法是在某源文件中定义一些宏指令,用定义常量的符号名称,用和21/21定义结构化的数据类型,然后用伪指令将这个 源文件包含到其他的源文件中。使用方法与 语言中的”相似。伪指令只能用于包含源文件,包含目标文件需要使用伪指令 使用示例:,;通知编译器当前源文件包含源文件 :;通知编译器当前源文件包含源文件:、语法格式:文件名 伪指令用于将一个目标文件或数据文件包含到当前的源文件中,被包含的文件不作任何变动的存放在当前文件中,编译器从其后开始继续处理。使用示例:,;通知编译器当前源文件包含文件 :;通知编译器当前源文件包含文件:、语法格式:名称 表达式 伪指令用于给一个寄存器定义一个别名。采用这种方式可以方便程序员记忆该寄存器的功
展开阅读全文