实验七 子程序的连接实验

各题目程序源代码在这里:Leeeeo’s Assembly-Language</strong>

一、实验目的

1.掌握主程序与子程序之间额连接方式;

2.掌握在源程序级程序的连接方法及此时源程序的结构;

3.掌握在目标级程序的连接方法及此时源程序的结构。

二、实验要求

1.仔细阅读教材中有关程序连接部分的内容;

2.学会伪指令INCLUDE,PUBLIC,EXTRN,GROUP的用法;

3.学会将子程序放在不同的代码段,用两种方法连接。

三、实验内容

1.将实验举例中的程序修改为在目标级上的连接,并调试、运行该程序。

解题思路:

修改程序,分别编译程序,再一起LINK。

PRIME子程序说明文件(EP711.ASM):

(1)子程序名:PRIME;

(2)子程序功能:判断一个数是否为素数;

(3)入口条件:要判断的数据在AX中;

(4)出口条件:CF=1如果AX中的数位素数;

(5)受影响的寄存器:标志寄存器F。

 

HTOA子程序说明文件(EP712.ASM):

(1)子程序名:HTOA;

(2)子程序功能:将一位十六进制数转换为ASCII码;

(3)入口条件:要转换的数据在AL中的低四位;

(4)出口条件:十六进制数的ASCII码在AL中;

(5)受影响的寄存器:AL和标志寄存器F。

BHTOA子程序说明文件(EP713.ASM):

(1)子程序名:BHTOA;

(2)子程序功能:将两位十六进制数转换为ASCII码;

(3)入口条件:要转换的数据在AL中;

(4)出口条件:高位十六进制数的ASCII码在AH中;

低位十六进制数的ASCII码在AL中;

(5)受影响的寄存器:AX和标志寄存器F。

QHTOA子程序说明文件(EP714.ASM):

(1)子程序名:QHTOA;

(2)子程序功能:将4位十六进制数转换为ASCII码;

(3)入口条件:要转换的数据在AX中;

(4)出口条件:最高位数的ASCII码在BH中;

次高位数的ASCII码在BL中;

次低位数的ASCII码在AH中;

最低位数的ASCII码在AL中;

(5)受影响的寄存器:AX、BX和标志寄存器F。

 

2.编写一个将AL中的两位十六进制数据在屏幕上显示的子程序。利用该子程序,从键盘接受一个字符,并将该字符的ASCII码显示在屏幕上。

解题思路:

从键盘接受一个字符,然后除以十六,再通过查表的方法,将ASCII码显示在屏幕上。

EP721.ASM子程序说明文件:

(1)子程序名:ASCII

(2)子程序功能:从栈顶取出一个数,递归方法求Fibonacci值,将结果入栈

(3)入口条件:栈顶元素为目标操作数

(4)出口条件:结果入栈

(5)受影响的寄存器:AX、BX和标志寄存器F

 

3.编写计算一个数组中所有正数之和的子程序,利用此子程序计算A、B两个数组中的正数之和。

解题思路:

将数组中的数依次与0作比较,将正数依次作和保存在寄存器中。

EP731.ASM子程序说明文件:

(1)子程序名:PLUSA

(2)子程序功能:计算一个数组中的所有正数之和;

(3)入口条件:数组长度放在CX,数组起始地址放在DI;

(4)出口条件:计算结果存放在DX中;

(5)受影响的寄存器:AX、BX、DX、DI和标志寄存器F

4.编写程序,将内存中由DATA单元开始,连续20个单元中存放的字节数据的最大值与最小值以十六进制形式显示在屏幕上。

要求:求最大值与最小值分别用子程序编写。

解题思路:

取第一个数作为初始的最大数,依次作比较,即可得到最大值。求最小值,同理可得。

EP741.ASM子程序说明文件:

(1)子程序名:MAX

(2)子程序功能:计算一个数组中的最大数;

(3)入口条件:数组长度放在CX,数组起始地址放在DI;

(4)出口条件:最大值存放在BL中;

(5)受影响的寄存器:BX、CX、DI和标志寄存器F

 

EP742.ASM子程序说明文件:

(1)子程序名:MIN

(2)子程序功能:计算一个数组中的最小数;

(3)入口条件:数组长度放在CX,数组起始地址放在DI;

(4)出口条件:最小值存放在BL中;

(5)受影响的寄存器:BX、CX、DI和标志寄存器F

5.已知在TEXT开始的内存单元中存放着一组英文文本,文本长度存放在CNT单元中。编制程序,用内存单元中由KEY开始的一组密钥字符串对其进行加密处理密钥的长度存放在KCNT单元中。加密处理的方法是用密钥字符串中的每个字符与文本中的字符逐个进行异或,若文本长度大于密钥字符串长度,当密钥字符串中的字符用完后,再从头重复使用,直至处理完文本串的所有字符。

要求:

(1)加密程序用子程序编写;

(2)将待加密的文本首址及长度、密钥首址及长度作为入口条件;

(3)用约定寄存器法传送参数

(4)用堆栈法传送参数。

解题思路:

将TEXT和KEY依次异或,当CNT大于KCNT时,每当KEY用完时,便让SI减去KCNT,使SI重新指向KEY开头。

 

EP751.ASM子程序说明文件:

(1)子程序名:SECRT

(2)子程序功能:加密处理文本;

(3)入口条件:堆栈中依次存放DI、SI、BX,CNT存放在CH单元,KCNT存放在CL 单元;

(4)出口条件:加密处理结果存放在BX指向的内存单元;

(5)受影响的寄存器:AX、BX、CX、DX和标志寄存器F

 

四、实验过程中遇到的问题及解决方法。

子程序连接时,会出现fixup overflow at 001E in segment CSEG的错误

解决办法:

调整LINK子程序的顺序,把主程序放最后。

各题目程序源代码在这里:Leeeeo’s Assembly-Language