实验二 基本算术运算

合集下载

实验二 数据类型及其运算

实验二 数据类型及其运算

实验二数据类型及其运算
【实验目的】:
1、进一步熟悉开发环境;
2、领会VB数据类型的基本概念;
3、掌握变量、常量的定义规则;掌握运算符的功能和表达式的组成及求值;
4、掌握部分常用VB内部函数的使用。

【实验学时】:2学时
【实验内容】:
在K盘建立名称为“班名学号姓名”文件夹,例如:养殖110140张三,之后在名字下面建立“实验2”文件夹保存本次实验作业。

1、实验指导书32页案例使用方法一,采用命令按钮转换温度值,存盘为:实验2.1CmdCF.frm和实验2.1CmdCF.vbp。

运行界面:
2、实验指导书34页案例使用方法二,不采用命令按钮转换温度值,存盘为:实验2.2NocmdCF.frm和实验2.2NocmdCF.vbp。

运行界面:
3、编写计算长方形面积的程序,存盘为:实验2.3Square.frm和实验实验2.3Square.vbp。

要求:定义两个变量,chang和kuan,类型为整形,用来保存用户输入的长度和宽度,定义square为长整型,保存面积。

控件属性表设置:
运行界面:。

实验二 古典密码

实验二 古典密码

实验2 古典密码1.实验目的(1)了解古典密码中的基本加密运算。

(2)了解几种典型的古典密码体制。

(3)掌握古典密码的统计分析方法。

2.实验内容(1)古典密码体制①简单移位加密(单表代换)该加密方法中,加密时将明文中的每个字母向前推移K位。

经典恺撒密码加密变换就是这种变换,取k=3。

步骤1:打开CAP4软件,并加载实验一附带的“mw.txt”,如图2-1所示。

图2-1加载文件步骤2:采用恺撒加密方法手工加密“mw.txt”;打开CAP4菜单栏“Cipher”菜单项选择“simple shift”选项,并选择移位值“shift value”为3,加密步骤1中加载的文件,如图2-2所示。

图2-2 参数设置图2-3加密文件步骤3:比较二者的加密结果是否相同。

步骤4:点击CAP4软件中的“Simple analysis”下的“shift”键,观察恺撒加密法的可能密钥值,并分析其攻击的难度,如图2-4所示。

图2-4密钥分析②仿射密码加密(单表代换)在仿射密码加密(affine cipher)中,字母表中的字母被赋予一个数字,例如,a=0,b=1,c=2,…,z=25.仿射密码加密法的密钥为0~25之间的数字对(a,b)。

a与26的最大公约数必须为1,这就是说能整除a和26的数只有1.现在假设m为明文字母的数字,而c为密文字母的数字,那么,这两个数字之间有如下关系: c=(am+b)(mod 26)m=a-1(c-b)(mod 26)其中,(mod 26)的操作是:除以26,得其余数。

例如,选取密钥为(7,3)。

因为7与26互素,也就是只有公约数1,所以(7,3)可以作为仿射密码的加密钥。

将“hot”转换成数字7、14、19,利用仿射等式生成: c(H)=(7×7+3) mod 26=52 mod 26=0,即为字母“a“。

c(O)=(7×14+3) mod 26=101 mod 26=23,即为字母“x“.c(T)=(7×19+3) mod 26=136 mod 26=6,即为字母”g”. 这样,对于这个密钥,”hot”变成了“axg“.CAP4软件中实现仿射密码加密:步骤1:在CAP4软件中加载要加密地的明文“mw.txt“.步骤2:选取Cipher菜单下的Affine Cipher菜单项,弹出如下对话框,如图2-5所示。

实验二 数据类型、运算符和表达式

实验二 数据类型、运算符和表达式
(1)
(2)
四、实验体会
作业一
已知以下各小题的初始值都是:i=2;j=2;
1、执行a=i+1,b=j+1后,a、b、i、j的值分别为?
2、执行a=i++,b=j++后,a、b、i、j的值分别为?
3、执行a=++i,b=++j后,a、b、i、j的值分别为?
4、执行a=i++ + ++j后,a、i、j的值分别为?
case 'B': cout<<"70~84";
case 'C': cout<<"60~69";
case 'D': cout<<"<60";
default: cout<<"Input error!";
}
return 0;
}
如果在键盘上输入B,会产生什么结果,为什么会产生这种结果?
5、a=+ + i + + + + + j + +,该表达式是否有错误,如果没有,请给出执行该表达式后a、i、j的值,如果有错误,请给出错误原因。
6、你理解的+,++,++i,i++的意义和优先级别。
作业二
已知a=3,b=4,执行以下语句:a=b,b=a希望交换两个变量的值。
请问上述操作会产生什么结果,为什么会产生这种结果?
作业三
已知以下程序:
#include
using namespace std;
int main ()

实验二 数据运算、顺序程序设计

实验二 数据运算、顺序程序设计

实验二数据运算、顺序程序设计实验目的:1 掌握C语言数据类型,了解字符型数据和整型数据的内在关系;2 掌握对各种数值型数据的正确输入方法,学会使用C的有关算数运算符;3 学会编写和运行简单的应用程序,进一步熟悉C程序的编辑、编译、连接和运行的过程。

实验学时:4学时实验内容:1 输入下面的程序#include<stdio.h>int main(){char c1,c2;c1=97;c2=98;printf("%c %c\n",c1,c2);printf("%d %d\n",c1,c2);return 0;}(1)运行该程序,分析为什么会输出这些信息。

(2)如果将程序第5、6行改为c1=197;c2=198;运行时会输出什么信息,为什么?2 输入下面的程序#include<stdio.h>int main(){int i,j,m,n;i=8;j=10;m=++i;n=j++;printf("%d,%d,%d,%d\n",i,j,m,n);return 0;}(1)编译和运行程序,注意i,j,m,n各变量的值。

(2)将第7、8行改为m=i++;n=++j;再次编译和运行,分析结果。

3 编写程序,求ax2+bx+c=0方程的根,a、b、c由键盘输入,且假设a不等于0,b2-4ac大于等于0.4 编译程序将‚China‛译成密码,密码规律是:用原来的字母后面第4个字母代替原来的字母。

例如,字母’A’后面的第四个字母是’E’,用’E’代替’A’。

因此,‚China‛应译为‚Glmre‛。

请编写程序,用赋初值的方法使c1,c2,c3,c4,c5这5‘l’,个变量的值分别为’C’,’h’,’i’,’n’,’a’,经过运算,使c1,c2,c3,c4,c5,分别变为’G’,‘m’,’r’‘e’。

分别用putchar函数和printf函数输出这5个字符。

实验报告算术逻辑单元

实验报告算术逻辑单元

一、实验目的1. 理解算术逻辑单元(ALU)的基本原理和功能。

2. 掌握ALU的设计方法和实现过程。

3. 通过实验加深对计算机组成原理的理解。

二、实验原理算术逻辑单元(ALU)是计算机中执行算术运算和逻辑运算的核心部件。

它主要完成加、减、乘、除等算术运算以及与、或、非、异或等逻辑运算。

ALU的设计和实现是计算机组成原理中的基础内容。

三、实验内容1. 设计一个8位ALU,能够完成加、减、乘、除、与、或、非、异或等运算。

2. 使用Verilog HDL语言实现该ALU。

3. 在FPGA平台上进行测试,验证ALU的功能。

四、实验步骤1. 分析ALU的功能需求,确定输入和输出信号。

2. 设计ALU的内部结构,包括运算单元、控制单元和寄存器。

3. 使用Verilog HDL语言编写ALU的代码。

4. 在FPGA平台上进行测试,验证ALU的功能。

五、实验结果与分析1. 实验结果根据实验要求,我们设计了一个8位ALU,能够完成加、减、乘、除、与、或、非、异或等运算。

以下是部分实验结果:(1)加法运算输入:A = 10101010,B = 11001100输出:10111010(2)减法运算输入:A = 11001100,B = 10101010输出:01010100(3)乘法运算输入:A = 10101010,B = 11001100输出:1111100000(4)除法运算输入:A = 11111111,B = 10000000输出:11111111(5)与运算输入:A = 10101010,B = 11001100输出:10001000(6)或运算输入:A = 10101010,B = 11001100输出:11101110(7)非运算输入:A = 10101010输出:01010101(8)异或运算输入:A = 10101010,B = 11001100输出:011001102. 实验分析通过实验,我们成功设计并实现了8位ALU。

基本的算术运算

基本的算术运算

基本的算术运算算术运算,这是我们日常生活、学习和工作中经常会用到的基本技能。

它看似简单,却蕴含着无尽的智慧和重要性。

我们最熟悉的算术运算,莫过于加法、减法、乘法和除法。

加法,就是把两个或多个数量合在一起,计算它们的总和。

比如,你有 3 个苹果,我再给你 2 个苹果,通过加法运算 3 + 2 = 5,你就知道现在一共拥有 5 个苹果。

加法在我们的生活中无处不在,购物时计算商品的总价,统计参加活动的人数等等。

减法与加法相反,是从一个数量中去掉一部分,求出剩余的数量。

例如,你原本有 10 元钱,买了一支 5 元的笔,那么 10 5 = 5,你还剩下 5 元钱。

减法在我们安排预算、比较数量差异时发挥着重要作用。

乘法是相同加数求和的简便运算。

比如,一箱苹果有 6 个,买了 5 箱,那么总共的苹果数量就是 6 × 5 = 30 个。

乘法让我们能够快速计算出多个相同数量的总和,在计算面积、体积、数量较多的重复物品时非常实用。

除法则是把一个数量平均分成若干份,求出每份的数量,或者是求一个数量里面包含多少个另一个数量。

假设共有 20 个糖果,要平均分给 4 个小朋友,20 ÷ 4 = 5,每个小朋友能得到 5 个糖果。

除法在分配资源、计算比例等方面是不可或缺的。

在进行算术运算时,我们需要遵循一定的运算顺序。

通常,先算乘除,后算加减。

如果算式中有括号,那么先算括号里面的。

比如计算 2 + 3 × 4,要先算乘法 3 × 4 = 12,再算加法 2 + 12 = 14。

而对于(2 + 3) × 4,就要先算括号里的加法 2 + 3 = 5,再算乘法 5 × 4 = 20。

基本的算术运算不仅在日常生活中有用,在学习数学的更高级领域,如代数、几何、微积分等,也是基础。

如果没有扎实的算术运算能力,后续的数学学习将会困难重重。

而且,算术运算对于培养我们的逻辑思维和解决问题的能力也十分重要。

算术运算基础练习

算术运算基础练习算术运算是数学中最基础的概念之一,它在我们日常生活中无处不在。

通过进行算术运算,我们可以解决很多实际问题,提高我们的数学能力和逻辑思维。

本文将为大家提供一些算术运算基础练习,帮助读者巩固数学基础知识。

一、加法运算(Addition)加法是一种最常见且最简单的算术运算,它是将两个或多个数值相加,得到它们的总和。

以下是一些加法练习题,供读者练习加法运算:1. 12 + 25 = ?2. 37 + 64 = ?3. 108 + 221 = ?4. 56 + 89 = ?5. 320 + 785 = ?二、减法运算(Subtraction)减法是与加法相对的一种算术运算,它是从一个数值中减去另一个数值,求得它们的差值。

以下是一些减法练习题,供读者练习减法运算:1. 56 - 23 = ?2. 120 - 48 = ?3. 340 - 215 = ?4. 78 - 45 = ?5. 532 - 289 = ?三、乘法运算(Multiplication)乘法是通过重复加法来计算两个或多个数的乘积。

以下是一些乘法练习题,供读者练习乘法运算:1. 8 × 6 = ?2. 13 × 4 = ?3. 27 × 9 = ?4. 5 × 11 = ?5. 16 × 8 = ?四、除法运算(Division)除法是将一个数值分成若干个相等的部分,或将一个数值平均分配给另一个数值。

以下是一些除法练习题,供读者练习除法运算:1. 36 ÷ 4 = ?2. 84 ÷ 7 = ?3. 135 ÷ 9 = ?4. 63 ÷ 9 = ?5. 246 ÷ 6 = ?五、混合运算练习综合练习题能够帮助我们将各种算术运算结合起来,提高我们的综合运算能力。

以下是一些混合运算练习题,供读者进行综合练习:1. 25 + 8 - 12 × 3 = ?2. (16 + 43) ÷ 7 + 12 = ?3. 45 - 18 × 2 + 7 = ?4. 36 ÷ (4 + 2) × 3 = ?5. 54 - 27 × 2 ÷ 9 = ?六、挑战题对于一些数学较为熟练的读者,我们也准备了一些较为复杂的挑战题,供他们进行挑战:1. 247 × 123 - 156 ÷ 13 = ?2. (85 - 39) × (7 + 3) ÷ 5 = ?3. 3456 ÷ (18 - 4 × 2) + 237 = ?4. (62 + 28) × (15 - 7) + 109 ÷ 7 = ?5. 8562 - (327 × 14 - 598) ÷ 23 = ?通过以上的算术运算基础练习,相信读者们可以对加法、减法、乘法和除法等算术运算有更深入的理解。

基本算法操作实验报告

一、实验目的1. 熟悉基本算法操作,包括排序、查找等。

2. 掌握常用算法的原理和实现方法。

3. 培养编程实践能力,提高算法设计水平。

二、实验环境1. 操作系统:Windows 102. 编程语言:Python3.73. 开发工具:PyCharm三、实验内容1. 排序算法2. 查找算法3. 算法分析四、实验步骤1. 排序算法(1)选择插入排序算法进行实现。

(2)编写代码,实现插入排序算法。

(3)编写测试用例,验证插入排序算法的正确性。

2. 查找算法(1)选择二分查找算法进行实现。

(2)编写代码,实现二分查找算法。

(3)编写测试用例,验证二分查找算法的正确性。

3. 算法分析(1)分析插入排序算法的时间复杂度和空间复杂度。

(2)分析二分查找算法的时间复杂度和空间复杂度。

五、实验结果与分析1. 排序算法(1)插入排序算法实现如下:```pythondef insertion_sort(arr):for i in range(1, len(arr)):key = arr[i]j = i - 1while j >= 0 and key < arr[j]:arr[j + 1] = arr[j]j -= 1arr[j + 1] = keyreturn arr```(2)测试用例:```pythontest_arr = [5, 2, 9, 1, 5, 6]sorted_arr = insertion_sort(test_arr)print("Sorted array:", sorted_arr)```输出结果:```Sorted array: [1, 2, 5, 5, 6, 9]```2. 查找算法(1)二分查找算法实现如下:```pythondef binary_search(arr, x):low = 0high = len(arr) - 1mid = 0while low <= high:mid = (high + low) // 2if arr[mid] < x:low = mid + 1elif arr[mid] > x:high = mid - 1else:return midreturn -1```(2)测试用例:```pythontest_arr = [1, 2, 3, 4, 5, 6, 7, 8, 9] x = 5result = binary_search(test_arr, x)if result != -1:print("Element is present at index", result)else:print("Element is not present in array")```输出结果:```Element is present at index 4```3. 算法分析(1)插入排序算法的时间复杂度为O(n^2),空间复杂度为O(1)。

计算机组成原理实验报告

湖南师范大学工程与设计学院计算机组成原理实验报告姓名:年级:2014级专业:计算机科学与技术学号:**********任课教师:***开课时间:2015~2016学年第二学期湖南师范大学工程与设计学院实验数据报告单实验课程:计算机组成原理实验题目:基本运算器实验实验日期:2016年 6月13日专业:计算机年级:2014级班级:五班姓名:一.实验目的:1.了解运算器的组成结构2.掌握运算器的工作原理二..实验内容:主要内容:该试验旨在了解运算器内部运算过程及组成结构,并能进行一些简单的数据运算。

该实验通过一片CPLD来实现运算器部件的功能,在接好的实验电路上,用CMA软件将数据加载加入内存,最终实现通过设置CON单元的S3、S2、S1、S0以及时序T1、T2、T3、T4的不同值来实现不同的功能。

表现在:用S3、S2、S1、S0的不同值并配合CN的值来实现将寄存器A、寄存器B中的两个数进行逻辑运算、移位运算、算术运算,并且加上时间脉冲的加入,并且能够准确的实现值的输出。

结果体现在:用FC灯亮表示有进位,FZ灯亮表示零标志,D7…D0灯显示通过运算后得出来的值。

三.实验原理图:图一(运算器原理图)四.实验数据与分析:0000:功能是F=A(直通),因为A=65,所以F=65,且没有进位,标志位也没有变化,所以FC=0,FZ=0. 0001: 功能是F=B (直通),因为A=A7,所以F=A7,且没有进位,标志位也没有变化,所以FC=0,FZ=0. 0010: 功能是F=AB,也就是A与B的逻辑与,所以F=25, 且没有进位,标志位也没有变化,所以FC=0,FZ=0. 0011:功能是F=A+B,也就是A与B的逻辑或,所以F=E7, 且没有进位,标志位也没有变化,所以FC=0,FZ=0. 0100: 功能是F=/A,0101:功能是F=A不带进位循环右移B(取低三位)位。

0110:功能是当CN=0时,F=A逻辑右移一位;当CN=1时,F=A带进位逻辑右移一位。

C语言实验2----基本的程序语句

C语言实验2----基本的程序语句1.1目的和要求(1)掌握C语言数据类型,熟悉如何定义一个整型、字符型、实型变量,以及对它们赋值的方法,了解以上类型数据输出时所用的格式转换符。

(2)学会使用C的有关算术运算符,及包含这些运算符的表达式,(3)自增(++)和自减(--)运算符的使用。

(4)了解字符在计算机中以ASCII码方式表示。

(5)掌握基本的输入输出函数scanf( )、printf( )的基本功能、调用方法、输入/输出格式控制规定等。

(6)巩固学生对于编程概念的理解。

1.2实验内容1.2.1实验练习1:表达式的计算。

实验目的:本实验旨在巩固学生对于编程概念的理解。

在这个实验中将练习:•如何定义浮点型变量•使用scanf输入用户提供的数据•使用printf输出变量问题描述:编写程序sy2_1.c进行温度转换计算,输入华氏温度h,输出摄氏温度c(摄氏温度=5/9*(华氏温度-32))。

示例输出:程序主体模板:#include<stdio.h>void main( ){float h, c;printf("请输入华氏温度:");/*接收用户输入的华氏温度*//*将华氏温度转化为摄氏温度*//*输出对应的摄氏温度*/}问题解答提示:1.依据题目,输入和输出数据均为温度,因此用float来表示,其中输入数据为华氏温度,输出数据为摄氏温度;2.提示用户输入华氏温度,并用scanf语句接收此值;3.根据华氏温度和摄氏温度之间的计算公式,将华氏温度转化为摄氏温度,并存储在变量c中;4.用printf语句显示对应的摄氏温度。

1.2.2实验练习2:自增运算符的使用。

实验目的:本实验旨在巩固学生对于编程概念的理解。

在这个实验中,学生将练习:•掌握自增(++)运算符的使用问题描述:编写程序sy2_2.c,观察其执行结果,思考自增运算符放在变量之前和放在变量之后,表达式的值有何不同。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

8 电子科技大学 实 验 报 告 9

实验二 基本算术运算 一、 实验目的和要求

加、减、乘、除是数字信号处理中最基本的算术运算。DSP中提供了大量的指令来实现这些功能。本实验学习使用定点DSP实现16位定点加、减、乘、除运算的基本方法和编程技巧。本实验的演示文件为exer1.out。

二、 实验原理 1.定点DSP中数据表示方法 C54X是16位的定点DSP。一个16位的二进制数既可以表示一个整数,也可以表示一个小数。当它表示一个整数时,其最低位(D0)表示02,D1位表示12,次高位(D14)表示142。如果表示一个有符号数时,最高位(D15)为符号位,0表示正数,1表示负数。例如,07FFFH表示最大的正数32767(十进制),而0FFFFH表示最大的负数-1(负数用2的补码方式显示)。当需要表示小数时,小数点的位置始终在最高位后,而

最高位(D15)表示符号位。这样次高位(D14)表示12,然后是22,最低位(D0)表示152。所以04000H表示小数0.5,01000H表示小数125.023,而0001H表示16位定点DSP能表示的最小的小数(有符号)152=0.000030517578125。在后面的实验中,除非有特别说明,我们指的都是有符号数。在C54X中,将一个小数用16位定点格式来表示

的方法是用152乘以该小数,然后取整。 从上面的分析可以看出,在DSP中一个16进制的数可以表示不同的十进制数,或者是整数,或者是小数(如果表示小数,必定小于1),但仅仅是在做整数乘除或小数乘除时,系统对它们的处理才是有所区别的,而在加减运算时,系统都当成整数来处理。

2.实现16定点加法 C54X中提供了多条用于加法的指令,如ADD,ADDC,ADDM和ADDS。其中ADDS用于无符号数的加法运算,ADDC用于带进位的加法运算(如32位扩展精度加法),而ADDM专用于立即数的加法。ADD指令的寻址方式很多,其详细使用说明请参考《TMS320C54X实用教程》。在本实验中,我们使用下列代码来说明加法运算:

ld temp1,a ;将变量temp1装入寄存器A add temp2,a ;将变量temp2与寄存器A相加,结果放入A中 stl a,add_result ;将结果(低16位)存入变量add_result中。

注意,这里完成计算temp3=temp1+temp2,我们没有特意考虑temp1和temp2是整数还是小数,在加法和下面的减法中整数运算和定点的小数运算都是一样的。

3.实现16位定点减法 C54X中提供了多条用于减法的指令,如SUB,SUBB,SUBC和SUBS。其中SUBS用于无符号数的减法运算,SUBB用于带进位的减法运算(如32位扩展精度的减法),而 10

SUBC为移位减,DSP中的除法就是用该指令来实现的。SUB指令与ADD指令一样,有许多的寻址方式,其详细使用说明请参考《TMS320C54X实用教程》。在本实验中,我们使用下列代码来说明减法运算:

stm #temp1,ar3 ;将变量temp1的地址装入ar3寄存器 stm #temp3,ar2 ;将变量temp3的地址装入ar3寄存器 sub *ar2+, *ar3,b ;将变量temp3左移16位同时变量temp1也左移16位,然后 ;相减,结果放入寄存器B(高16位)中,同时ar2加1。 sth b,sub_result ;将相减的结果(高16位)存入变量sub_result。

4.实现16定点整数乘法 在C54X中提供了大量的乘法运算指令,其结果都是32位,放在A或B寄存器中。乘数在C54X的乘法指令很灵活,可以是T寄存器、立即数、存贮单元和A或B寄存器的高16位。有关乘法指令的详细使用说明请参考《TMS320C54X实用教程》。在C54X中,一般对数据的处理都当做有符号数,如果是无符号数乘时,请使用MPYU指令。这是一条专用于无符号数乘法运算的指令,而其它指令都是有符号数的乘法。在本实验中,我们使用下列代码来说明整数乘法运算:

rsbx FRCT ;清FRCT标志,准备整数乘 ld temp1,T ;将变量temp1装入T寄存器 mpy temp2,a ;完成temp2*temp1,结果放入A寄存器(32位)

例如,当temp1=1234H(十进制的4660),temp2=9876H(十进制的-26506),乘法的结果在A寄存器中为0F8A343F8H(十进制的-123517960)。这是一个32位的结果,需要两个内存单元来存放结果:

sth a,mpy_I_h ;将结果(高16位)存入变量mpy_I_h stl a,mpy_I_l ;将结果(低16位)存入变量mpy_I_l

当temp1=10H(十进制的16),temp2=05H(十进制的5),乘法结果在A寄存器中为00000050H(十进制的80)。对于这种情况,仅仅需要保存低16位即可:

stl a,mpy_I_l ;将结果(低16位)存入变量mpy_I_l 5.实现16定点小数乘法 在C54X中,小数的乘法与整数乘法基本一致,只是由于两个有符号的小数相乘,其结果的小数点的位置在次高的后面,所以必须左移一位,才能得到正确的结果。C54X中提供了一个状态位FRCT,将其设置为1时,系统自动将乘积结果左移移位。但注意整数乘法时不能这样处理,所以上面的实验中一开始便将FRCT清除。两个小数(16位)相乘后结果为32位,如果精度允许的话,可以只存高16位,将低16位丢弃,这样仍可得到16位的结果。在本实验中,我们使用下列代码来说明小数乘法运算:

ssbx FRCT ;FRCT=1,准备小数乘法 11

ld temp1,16,a ;将变量temp1装入寄存器A的高16位 mpya temp2 ;完成temp2乘寄存器A的高16位,结果在B中,同时 ;将temp2装入T寄存器 sth b,mpy_f ;将乘积结果的高16位存入变量mpy_f

例如,temp1=temp2=4000H(十进制的0.5),两数相乘后结果为20000000(十进制的22=0.25)。再如,temp1=0ccdH(十进制的0.1),temp2=0599aH(十进制的0.7),两

数相乘后B寄存器的内容为08f5f0a4H(十进制的0.07000549323857)。如果仅保存结果的高16位08f5H(十进制的0.06997680664063)。有时为了提高精度,可以使用RND或使用MPYR指令对低16位做四舍五入的处理。

6.实现16定点整数除法 在C54X中没有提供专门的除法指令,一般有两种方法来完成除法。一种是用乘法来代替,除以某个数相当于乘以其倒数,所以先求出其倒数,然后相乘。这种方法对于除以常数特别适用。另一种方法是使用SUBC指令,重复16次减法完成除法运算。下面我们以temp1/temp2为例,说明如何使用SUBC指令实现整数除法。其中变量temp1为被除数,temp2为除数,结果即商存放在变量temp3中。在完成整数除法时,先判断结果的符号。方法是将两数相乘,保存A或B的高16位以便判断结果的符号。然后只做两个正数的除法,最后修正结果的符号。为了实现两个数相除,先将被除数装入A或B的低16位,接着重复执行SUBC指令,用除数重复减16次后,除法运算的商在累加器的低16位,余数在高16位。详细代码如下:

ld temp1,T ;将被除数装入T寄存器 mpy temp2,A ;除数与被除数相乘,结果放入A寄存器 ld temp2,B ;将除数temp2装入B寄存器的低16位 abs B ;求绝对值 stl B,temp2 ;将B寄存器的低16位存回temp2 ld temp1,B ;将被除数temp1装入B寄存器的低16位 abs B ;求绝对值 rpt #15 ;重复SUBC指令16次 subc temp2,b ;使用SUBC指令完成除法运算 bcd div_end,agt ;延时跳转,先执行下面两条指令,然后判断A,若A>0,则 ;跳转到标号div_end,结束除法运算 stl B,quot_i ;将商(B寄存器的低16位)存入变量quot_i sth B,remain_i ;将余数(B寄存器的高16位)存入变量remain_i xor B ;若两数相乘的结果为负,则商也应为负。先将B寄存器清0 sub quot_i,B ;将商反号 stl B,quot_i ;存回变量quot_i中 div_end:

上面给出的是整数除法的通用程序,在实际应用中可以根据具体情况做简化。如正数除法可以直接将被除数temp1装入B寄存器的低16位,然后用SUBC指令循环减除 12

数temp2,减完后B寄存器中低16位为商,高16位为余数,不用判断符号,从而节省时间。例如temp1=10H(十进制的16),temp2=5,两数相除后商为3(在B寄存器的低16位),余数为1(在B寄存器的高16位)。

7.实现16定点小数除法 在C54X中实现16位的小数除法与前面的整数除法基本一致,也是使用循环的SUBC指令来完成。但有两点需要注意:第一,小数除法的结果一定是小数(小于1),所以被除数一定小于除数。这与整数除法正好相反。所以在执行SUBC指令前,应将被除数装入A或B寄存器的高16位,而不是低16位。其结果的格式与整数除法一样,A或B寄存器的高16位为余数,低16位为商。第二,与小数乘法一样,应考虑符号位对结果小数点的影响。所以应对商右移一位,得到正确的有符号数。其详细代码如下:

ld temp1,T ;将被除数装入T寄存器 mpy temp2,A ;除数与被除数相乘,结果放入A寄存器 ld temp2,B ;将除数temp2装入B寄存器的低16位 abs B ;求绝对值 stl B,temp2 ;将B寄存器的低16位存回temp2 ld temp1,16,B ;将被除数temp1装入B寄存器的高16位 abs B ;求绝对值 rpt #15 ;重复SUBC指令16次 subc temp2,b ;使用SUBC指令完成除法运算 and #0ffffh,B ;将B寄存器的高16位清为0。这时余数被丢弃,仅保留商 bcd div_end,agt ;延时跳转,先执行下面两条指令,然后判断A,若A>0,则 ;跳转到标号div_end,结束除法运算 stl B,-1,quot_f ;将商右移一位后存入变量quot_f,右移是为了修正符号位 xor B ;若两数相乘的结果为负,则商也应为负。先将B寄存器清0 sub quot_f,B ;将商反号 stl B,quot_f ;存回变量quot_f中 div_end:

相关文档
最新文档