正在加载图片...
第9章两种典至的微处理器201 下载 地址返回到原来的位置。这个返回指令叫 Return. return指令从堆栈中弹出两个字节,并把该 装载到PC中 Cal和 Return指令是任何处理器中都很重要的功能。它们允许程序员编写子程序,子程序 是程序中经常用到的代码段。(“经常”一般意味着“不止一次”。)子程序是汇编语言中的基 本组成部分 让我们看一个例子。假设你正在编写一个汇编语言程序,并且需要使两个数相乘,因此 你可以写出一段代码来做这项工作,然后继续往下编写程序,现在又需要使两个数相乘。因 为你已知道如何进行两数相乘,因此你只需简单地重复使用同样的指令来完成它。但只是简 单地两次把这些指令输入到存储器吗?希望不是,这是对时间和存储空间的浪费,更好的方 法是转送到原来的代码处。由于无法返回到程序的当前位置,所以一般的Jump指令不能用。 但使用Call和 Return指令可以让你完成所需的功能。 进行两数相乘的一组指令可以作为一个子程序。下面就是这样的子程序。在第17章中, 被乘数(和结果)存放在存储器的某一地址中:而在8080子程序中,寄存器B的值和寄存器C 中的值相乘,然后把16位乘积装入寄存器HL中 Multiply 保存要改变的寄存器 SUB H, H 设置HL(结果)为0000h 乘数送到A 如果为0,结束 Jz AllDone MVI B, oOh Bc的高字节置0 Multiloop DAD HL, BC ;Bc加到HL 乘数减1 JNZ Multiloop 不为0,转移 AllDone 恢复保存的寄存器 返回 注意,上述子程序的第1行开始有一个标号 Multiply。当然,这个标号对应于子程序所在 的存储器地址。子程序开始用了两个PUSH指令,通常在子程序开始处应先保存(以后恢复) 它需要使用的寄存器。 然后该子程序把H和L寄存器置为0。虽然可以使用MⅥI指令而不用SUB指令,但那需要使 用4个字节的指令而不是2个字节的指令。子程序执行完后,寄存器对HL中保存有相乘的结果。 下一步该子程序把寄存器B的内容(乘数)移入A中,并且检查它是否为0。如果它为 乘法子程序到此结束,因为结果为0。由于寄存器H和L已经为0,因而子程序可以只使用J指 令跳转到末端的两个POP指令处 否则,子程序把寄存器B置为0。现在,寄存器对BC中包含一个16位的被乘数,A中为乘 数。DAD指令把BC(被乘数)加到HL(结果)中。A中的乘数减1,且只要它不为0,JNZ指 令就又使BC加到HL中。此小循环继续下去,直到BC加到HL中的次数等于乘数。(可以用 8080的移位指令编写一个更有效的乘法子程序。)第19章 两种典型的微处理器 201 下载 地址返回到原来的位置。这个返回指令叫 R e t u r n。R e t u r n指令从堆栈中弹出两个字节,并把该 值装载到P C中。 C a l l和R e t u r n指令是任何处理器中都很重要的功能。它们允许程序员编写子程序,子程序 是程序中经常用到的代码段。(“经常”一般意味着“不止一次”。)子程序是汇编语言中的基 本组成部分。 让我们看一个例子。假设你正在编写一个汇编语言程序,并且需要使两个数相乘,因此 你可以写出一段代码来做这项工作,然后继续往下编写程序,现在又需要使两个数相乘。因 为你已知道如何进行两数相乘,因此你只需简单地重复使用同样的指令来完成它。但只是简 单地两次把这些指令输入到存储器吗?希望不是,这是对时间和存储空间的浪费,更好的方 法是转送到原来的代码处。由于无法返回到程序的当前位置,所以一般的 J u m p指令不能用。 但使用C a l l和R e t u r n指令可以让你完成所需的功能。 进行两数相乘的一组指令可以作为一个子程序。下面就是这样的子程序。在第 1 7章中, 被乘数(和结果)存放在存储器的某一地址中;而在 8 0 8 0子程序中,寄存器 B的值和寄存器C 中的值相乘,然后把1 6位乘积装入寄存器H L中: Multiply: PUSH PSW ;保存要改变的寄存器 PUSH BC SUB H,H ;设置HL(结果)为0000h SUB L,L MOV A,B ;乘数送到A CPI A,00h ;如果为0,结束 JZ AllDone MVI B,00h ;BC的高字节置0 Multloop: DAD HL,BC ;BC 加到HL DEC A ;乘数减1 JNZ Multloop ;不为0,转移 AllDone: POP BC ;恢复保存的寄存器 POP PSW RET ;返回 注意,上述子程序的第 1行开始有一个标号 M u l t i p l y。当然,这个标号对应于子程序所在 的存储器地址。子程序开始用了两个 P U S H指令,通常在子程序开始处应先保存(以后恢复) 它需要使用的寄存器。 然后该子程序把H和L寄存器置为0。虽然可以使用M V I指令而不用S U B指令,但那需要使 用4个字节的指令而不是2个字节的指令。子程序执行完后,寄存器对 H L中保存有相乘的结果。 下一步该子程序把寄存器 B的内容(乘数)移入 A中,并且检查它是否为 0。如果它为0, 乘法子程序到此结束,因为结果为 0。由于寄存器H和L已经为0,因而子程序可以只使用 J Z指 令跳转到末端的两个P O P指令处。 否则,子程序把寄存器 B置为0。现在,寄存器对 B C中包含一个1 6位的被乘数,A中为乘 数。D A D指令把B C(被乘数)加到H L(结果)中。A中的乘数减1,且只要它不为0,J N Z指 令就又使 B C加到H L中。此小循环继续下去,直到 B C加到H L中的次数等于乘数。(可以用 8 0 8 0的移位指令编写一个更有效的乘法子程序。)
<<向上翻页向下翻页>>
©2008-现在 cucdc.com 高等教育资讯网 版权所有