汇编语言第十章课程设计题

合集下载

汇编语言 第10章

汇编语言 第10章
行 程 序 第n条指令 第n+1条指令 例 行 程 序 中 断 服 务 程 序
3
中断控制技术主要应用在下列几种场合: 1、及时处理计算机中的突发故障。如执行指令时产生溢出,内存出 错等。 2、协调主机与外设工作速度的矛盾。 3、在实时控制系统中,及时处理各控制点的现场信息。 二、中断源及中断类型码 引起中断的原因或来源称为中断源。8086/8088CUP可以处理256种 类型的中断,这些中断源可分为两大类。 1、外部中断 非CUP内部原因产生的中断,称为外部中断。外部中断又分为非屏 蔽中断和可屏蔽中断。 可屏蔽中断 ——可以通过标志寄存器中的中断允许位IF控制CUP 是否响应中断请求。当IF=1,允许CUP响应可屏蔽中断;IF=0,禁止 CUP响应可屏蔽中断。IF由指令STI和CLI设置。 非屏蔽中断 ——不能由IF控制的中断源。当非屏蔽中断发生后, CUP一定要响应。
. . .
类型0 类型1 类型2
IP CS IP CS
类型254 类型255
5
四、中断过程 一个完整的中断过程包括以下四个步骤: 1、中断请求 一个中断源当满足一定条件后,将向CPU提出中断请求。 2、中断响应 CPU每执行完一条指令后,都要查询是否有中断请求送来,按照 一定次序查询各种中断源。如果有中断请求,根据一定的规定和条件 决定是否响应该中断。如果CPU响应中断,则将做以下几项工作: * 将标志寄存器内容压栈; * 保存断点(CS和IP内容压栈); * 禁止新的中断 (IF<=0, TF<=0); * 根据中断类型码从中断矢量表取出中 断服务程序的入口地址,送入IP和CS。 3、中断处理 执行中断服务程序就是完成中断处理。根据中断源的不同,所要 求的处理也不同。因此其中断处理程序也不相同。

java语言程序设计第十章十二题参考答案

java语言程序设计第十章十二题参考答案

10.12 定义Myrectangle类,包含: 两个名为x和y的double 型数据域,表明矩形的中心点,这两个数据域都带有get和set方法(假设这个矩形的边和x和y轴平行); 带get和set方法的数据域width和height. 一个无参构造方法,,该方法创建一个(x,y)的值为(0,0)且width和height的默认值为1. 一个构造方法,创建带制定的x,y,width,height的矩形。 方法getArea()返回矩形的面积。 方法getPrimeter()返回矩形的周长。 如果给定的点(x,y)在矩形内,那么方法contains(double x,double y)返回true. 如果给定的矩形在这个矩形内,那么方法contains(Myrectangle2D r)返回true。 如果给定的矩形和这个矩形重叠,那么方法overlaps(Myrectangle2D r)返回true. 画出该类的UML图,实现这个类。 代码为: class MyRectangle2D{ double x=0,y=0;//x,y表示矩形中心点 double width=1,height=1; public double getX(){ return x; } public double getY(){ return y; } public void setX(double x){ this.x=x; } public void setY(double y){ this.y=y; } public double getWidth(){ return width; } public void setWidth(double width){ this.width=width; } public double getHeight(){ return height;

} public void setHeight(double height){ this.height=height; } MyRectangle2D(double x,double y,double width,double height){ this.x=x; this.y=y; this.width=width; this.height=height; }

汇编语言程序设计题目以及答案

汇编语言程序设计题目以及答案

汇编语言程序设计题目以及答案[P1] 汇编语言程序设计题目以及答案汇编语言是一种底层计算机语言,它直接使用机器指令来编写程序。

本文将介绍一些汇编语言程序设计的题目,并提供相应的答案。

通过这些题目和答案的学习,读者可以更好地理解和掌握汇编语言程序设计的基本概念和技巧。

[题目一] 计算两个数的和要求:编写汇编程序,计算两个给定的整数的和,并将结果存储在指定的内存位置中。

答案:```assemblysection .datanum1 dd 10 ; 第一个整数num2 dd 20 ; 第二个整数result dd 0 ; 结果section .textglobal _start_start:mov eax, [num1] ; 将num1值存入寄存器eaxadd eax, [num2] ; 将num2值与eax寄存器中的值相加mov [result], eax ; 将结果存储到result变量mov eax, 1 ; 准备执行系统调用mov ebx, 1 ; 文件描述符:标准输出mov ecx, result ; 输出的数据mov edx, 4 ; 数据长度int 0x80 ; 执行系统调用mov eax, 1 ; 准备执行系统调用xor ebx, ebx ; 正常退出int 0x80 ; 执行系统调用```[题目二] 字符串反转要求:编写汇编程序,将一个给定的字符串反转,并将结果存储在指定的内存位置中。

答案:```assemblysection .datastr db 'Hello', 0 ; 待反转的字符串section .bssreverse resb 6 ; 存储反转后的字符串section .textglobal _start_start:mov esi, str ; esi指向待反转的字符串mov edi, reverse ; edi指向存储反转结果的位置 mov ecx, 5 ; 字符串长度为5mov ebx, 1 ; ebx用于计数reverse_loop:mov al, [esi+ebx]mov [edi-ebx+5], alinc ebxloop reverse_loopmov byte [edi+5], 0 ; 在末尾添加字符串结束符 mov eax, 4 ; 准备执行系统调用mov ebx, 1 ; 文件描述符:标准输出mov ecx, reverse ; 输出的数据mov edx, 6 ; 数据长度int 0x80 ; 执行系统调用mov eax, 1 ; 准备执行系统调用xor ebx, ebx ; 正常退出int 0x80 ; 执行系统调用```[题目三] 求平均数要求:编写汇编程序,计算给定的一组整数的平均数,并将结果存储在指定的内存位置中。

汇编语言程序设计教案及习题答案

汇编语言程序设计教案及习题答案

汇编语言程序设计教案及习题答案教案章节:一、汇编语言简介1. 汇编语言的概念2. 汇编语言的特点3. 汇编语言的应用领域二、汇编语言的基本语法1. 数据类型及表示2. 指令格式及分类3. 寄存器使用规则三、汇编语言程序设计步骤1. 分析需求,确定程序功能2. 选择合适的汇编语言及开发环境3. 编写汇编代码,调试程序4. 优化程序性能四、常用汇编指令及功能1. 数据传输指令2. 算术运算指令3. 逻辑运算指令4. 控制流指令5. 字符串操作指令6. 中断指令五、汇编语言与C语言的接口编程1. extern声明汇编函数2. 调用汇编函数的方法3. 汇编函数与C函数的数据交换4. 实例分析:汇编语言实现字符串排序习题答案:一、汇编语言简介1. 汇编语言是一种低级编程语言,用于编写计算机程序。

(正确)2. 汇编语言可以直接操作计算机硬件资源。

(正确)3. 汇编语言程序可读性差,不易维护。

(正确)二、汇编语言的基本语法1. 数据类型及表示a. 字节:8位(正确)b. 字:16位(正确)c. 双字:32位(正确)d. 四字:64位(正确)2. 指令格式及分类a. 操作码(正确)b. 操作数(正确)c. 寄存器(正确)d. 标志位(正确)3. 寄存器使用规则a. 通用寄存器:AX, BX, CX, DX(正确)b. 段寄存器:CS, DS, ES, SS(正确)c. 指令指针:IP(正确)d. 状态寄存器:FLAGS(正确)三、汇编语言程序设计步骤1. 分析需求,确定程序功能(正确)2. 选择合适的汇编语言及开发环境(正确)3. 编写汇编代码,调试程序(正确)4. 优化程序性能(正确)四、常用汇编指令及功能1. 数据传输指令a. MOV:数据传送(正确)b. PUSH:压栈(正确)c. POP:出栈(正确)d. XCHG:交换数据(正确)2. 算术运算指令a. ADD:加法(正确)b. SUB:减法(正确)c. MUL:无符号乘法(正确)d. IMUL:有符号乘法(正确)3. 逻辑运算指令a. AND:逻辑与(正确)b. OR:逻辑或(正确)c. XOR:逻辑异或(正确)d. NOT:逻辑非(正确)4. 控制流指令a. JMP:无条件跳转(正确)b. JE:相等跳转(正确)c. JNE:不相等跳转(正确)5. 字符串操作指令a. MOVS:字符串移动(正确)b. CMPS:字符串比较(正确)c. SCAS:字符串扫描(正确)d. LODS:字符串装载(正确)6. 中断指令a. INT:软件中断(正确)b. INTO:中断向量表(正确)五、汇编语言与C语言的接口编程1. extern声明汇编函数(正确)2. 调用汇编函数的方法(正确)3. 汇编函数与C函数的数据交换(正确)4. 实例分析:汇编语言实现字符串排序(正确)汇编语言程序设计教案及习题答案教案章节:六、汇编语言的输入与输出1. 输入输出指令2. 字符串操作指令3. 实例分析:编写一个简单的输入输出程序七、汇编语言的杂项指令1. 杂项指令的概念2. 常用杂项指令及其功能3. 实例分析:杂项指令的应用八、汇编语言的子程序调用1. 子程序调用的概念2. 子程序的定义与调用3. 子程序的返回4. 实例分析:子程序在汇编语言中的应用九、汇编语言的程序举例1. 实例一:计算两个数的和2. 实例二:字符串的复制3. 实例三:数制的转换4. 实例四:文件的读写十、汇编语言程序的调试与优化1. 调试工具的使用2. 调试方法与技巧3. 程序优化的概念4. 程序优化的方法与技巧习题答案:六、汇编语言的输入与输出1. 输入输出指令a. IN:输入指令(正确)b. OUT:输出指令(正确)c. INPUT:输入函数(正确)d. PRINT:输出函数(正确)2. 字符串操作指令a. MOVS:字符串移动(正确)b. CMPS:字符串比较(正确)c. SCAS:字符串扫描(正确)d. LODS:字符串装载(正确)3. 实例分析:编写一个简单的输入输出程序(正确)七、汇编语言的杂项指令1. 杂项指令的概念(正确)2. 常用杂项指令及其功能a. NOP:无操作(正确)b. HLT:停止CPU运行(正确)c. CMC:翻转标志位(正确)d. ARPL:寄存器之间交换(正确)3. 实例分析:杂项指令的应用(正确)八、汇编语言的子程序调用1. 子程序调用的概念(正确)2. 子程序的定义与调用a. 定义子程序(正确)b. 调用子程序(正确)3. 子程序的返回(正确)4. 实例分析:子程序在汇编语言中的应用(正确)九、汇编语言的程序举例1. 实例一:计算两个数的和(正确)2. 实例二:字符串的复制(正确)3. 实例三:数制的转换(正确)4. 实例四:文件的读写(正确)十、汇编语言程序的调试与优化1. 调试工具的使用(正确)2. 调试方法与技巧(正确)3. 程序优化的概念(正确)4. 程序优化的方法与技巧(正确)汇编语言程序设计教案及习题答案教案章节:十一、汇编语言与操作系统1. 操作系统的概念2. 汇编语言在操作系统中的应用3. 实例分析:汇编语言编写简单的操作系统十二、汇编语言与设备驱动程序1. 设备驱动程序的概念2. 汇编语言在设备驱动程序开发中的应用3. 实例分析:汇编语言编写简单的设备驱动程序十三、汇编语言与嵌入式系统1. 嵌入式系统的概念2. 汇编语言在嵌入式系统中的应用3. 实例分析:汇编语言编写简单的嵌入式系统十四、汇编语言与汇编器的使用1. 汇编器的概念2. 汇编器的使用方法3. 实例分析:使用汇编器编写和调试汇编程序十五、汇编语言与汇编语言的未来发展1. 汇编语言的发展趋势2. 汇编语言在未来的应用领域3. 汇编语言学习的方法与建议习题答案:十一、汇编语言与操作系统1. 操作系统的概念(正确)2. 汇编语言在操作系统中的应用(正确)3. 实例分析:汇编语言编写简单的操作系统(正确)十二、汇编语言与设备驱动程序1. 设备驱动程序的概念(正确)2. 汇编语言在设备驱动程序开发中的应用(正确)3. 实例分析:汇编语言编写简单的设备驱动程序(正确)十三、汇编语言与嵌入式系统1. 嵌入式系统的概念(正确)2. 汇编语言在嵌入式系统中的应用(正确)3. 实例分析:汇编语言编写简单的嵌入式系统(正确)十四、汇编语言与汇编器的使用1. 汇编器的概念(正确)2. 汇编器的使用方法(正确)3. 实例分析:使用汇编器编写和调试汇编程序(正确)十五、汇编语言与汇编语言的未来发展1. 汇编语言的发展趋势(正确)2. 汇编语言在未来的应用领域(正确)3. 汇编语言学习的方法与建议(正确)重点和难点解析本文主要介绍了汇编语言程序设计的基础知识和应用领域,通过详细的章节安排,从汇编语言的基本概念、语法规则、程序设计步骤、常用指令及其功能、输入输出操作、杂项指令、子程序调用、程序举例、调试与优化等方面进行了深入讲解。

汇编语言程序设计 习题与答案.ppt

汇编语言程序设计 习题与答案.ppt
习题与答案
❖第一章 基础知识 ❖第二章 80x86计算机组织 ❖第三章 指令系统和寻址方式 ❖第四章 汇编语言程序格式 ❖第五章 循环与分支程序设计 ❖第六章 子程序设计 ❖第七章 高级汇编语言技术 ❖第八章 输入输出程序设计
2020-6-17
谢谢阅读
1
第一章 基础知识 1. P14,1、2、6、7题。
系统程序。 13. 连接程序I:把若干模块连接成可执行文件的系统程序 14. 指令O:告诉CPU要执行的操作,在程序运行时执行 15. 伪指令N:由汇编程序在汇编过程中执行的指令。
谢谢阅读
2020-6-17
13
第三章 指令系统和寻址方式
• P107,1、2、3、4、5、8、13、14、15、17、 18、19、23、25、27、29、30、32、33、35、 37、38、49、51题。
– 逻辑地址:3010:007A
• 3010H * 16D + 7AH = 30100H + 7AH = 3017AH
– 总结:
• 同一物理地址,可用不同逻辑地址表示。
谢谢阅读
2020-6-17
11
第二章 80x86计算机组织 — 2.9
2.9:CPU、存储器、堆栈、IP、SP、状态标志 1. CPUM:分析、控制、执行指令的部件, 由ALU与寄存器等组成。 2. 存储器C:存储程序、数据等信息的记忆装 置,微机有RAM与ROM两种。 3. 堆栈D:以后进先出方式工作的存储空间。 4. IPB:指示下一条指令的地址。 5. SPA:保存当前栈顶地址的寄存器。 6. 状态标志L:记录指令操作结果的标志。 7. 控制标志K:控制操作的标志,如DF位。 8. 段寄存器J:保存各段起始地址的寄存器。

实验十 汇编语言程序

实验十  汇编语言程序

实验十汇编语言程序(一)一、实验目的:1、全面掌握汇编程序和汇编语言源程序。

2、了解掌握汇编语言源程序的编写、调试程序的方法。

3、掌握汇编语言源程序结构,为后续汇编语言程序设计打好基础。

二、实验内容(任选一题)1、读懂下列源程序,使用EDIT生成名为EX11.ASM的源程序,汇编生成EX11.OBJ文件、EX11.LST文件,连接生成EX11.EXE文件;用EDIT打开EX11.LST文件,了解.LST文件包含的信息;使用DEBUG调试工具单步执行EX11.EXE程序,注意观察IP值的变化,并回答下列问题。

(1)程序装入后,代码段寄存器CS的内容为____13DA____H,代码段第一条可执行指令MOV AX, DATA对应的机器代码为_____b8d913_____H,它是一个____3____字节指令,注意观察执行该指令时IP值的变化情况,该指令源操作数DATA的寻址方式是_____直接寻址_____,其值为_____13d9_____。

(2)执行完MOV DS, DATA指令后,数据段寄存器DS的内容为_____13d9___H,源程序在数据段中定义的数据82H、68H和88H被装入的存储单元的物理地址分别为___13D90_____H、___13D91_____H和____13D92___H。

(3)程序中第一条ADD AL, [BX] 指令对应的机器代码为_____0207_____H,它是一个____2____字节指令,注意观察执行该指令时IP值的变化情况;该指令中源操作数的寻址方式为____寄存器间接寻址______,该操作数所在存储单元的逻辑地址(DS): (BX)为____0000______,其物理地址为____13960______H;执行完该指令后(AL)=___82___H,CF=___0___,OF___1___,ZF___1___,SF____0__,AF____0__,PF___0___;若两操作数为无符号数,计算结果是否正确____正确___?若两操作数为带符号数,计算结果是否正确_____正确___?若计算结果正确,结果是正数还是负数___正数___?(4)执行完第二条ADD AL, [BX] 指令后(AL)=__EA____H,CF=___1___,OF__1____,ZF___0___,SF__1____,AF__1____,PF___1___;若两操作数为无符号数,计算结果是否正确__错误_____?若两操作数为带符号数,计算结果是否正确_____错误___?(5)指令MOV SUM, AL中目的操作数的寻址方式为_____寄存器寻址_____。

汇编语言10.

(1)取两数的最高字节进行异或,保存标志寄存器; (2)若乘数为正,则转(4); (3)若乘数为负,则将乘数取补; (4)若被乘数为正,则转(6); (5)若被乘数为负,则将被乘数取补; (6)两个数的绝对值相乘,得乘积的绝对值; (7)取出标志寄存器的原有内容,判断符号标志位SF; (8)若SF为0,则乘积应为正,转(10) (9)若SF为1,则乘积应为负,对乘积的绝对值取补; (10)结束。
第 10 章
算术运算与代码转换
学习重点
介绍多字节整数运算、浮点 运 算 和 BCD 码 运 算 的 程 序 设计方法,十进制数据的 ASCII 码串与二进制代码转 换等。重点掌握:
多字节运算
代码转换的问题
算术运算与代码转换
10.1 多字节加减运算 10.2 多字节整数乘除运算 10.3 BCD码运算 10.4 浮点数的表示法 10.5 浮点数的加减法 10.6 浮点数的乘除法 10.7 十进制数的ASCII码串转换为二进制定点数 10.8 二进制定点数转换为十进制数的ASCII码串 10.9 实数的ASCII码转换为浮点数 10.10 浮点数转换为十进制数的ASCII码串
0110
1 0 1 1 ………商 01000011 0110 00010 01 0110 0011 1 0110 0001………余数
由上述过程可以看出人工 笔算除法的步骤: (1)判断被除数(以后 为余数)是否大于除数。若大 于除数,则从被除数(后为余 数)中减去除数,该位商上1; 否则不减除数,商上0; (2)落下被除数中的下 一位,重复第一步,直至得到 商的最低位。
下面给出一个采用如上所述的算法实现的两个单字节 数据相乘的乘法子程序。
第10章
10.2.2 多字节整数乘法运算

第十章类模板课后编程题目答案

1。

设计一个类模板,其中包含数据成员Ta[n]以及对其进行排序的成员函数Sort(),模板参数T可实例化成字符串。

解;如果T仅仅可以实例化成基本数据类型与char*类型的字符串,可通过重载sort() 实现,程序如下:#include <iostream.h>#include <string.h>template <class T,int n>class Array{private:T a[n];public:void sort(double){for (int i=0;i<n-1;i++)for (int j=i+1;j<n;j++)if (a[i]>a[j]){T t;t=a[i];a[i]=a[j];a[j]=t;}}void sort(char *){for (int i=0;i<n-1;i++)for (int j=i+1;j<n;j++)if (a[j]==NULL||(a[i]!=NULL&& strcmp(a[i],a[j])>0)){T t;t=a[i];a[i]=a[j];a[j]=t;}}void disp(){for (int i=0;i<n-1;i++)if (a[i]!=NULL)cout<<a[i]<<",\t";elsecout<<",\t";if (a[i]!=NULL)cout<<a[i]<<endl;elsecout<<endl;}Array(T a[]){for (int i=0;i<n;i++)this->a[i]=a[i];}};void main(){float f[]={1.2,2.3,7.7,4,3,4,2.3};Array<float,6> a1(f);a1.sort(f[0]);a1.disp();char * a[6]={"a","abc","ABC","abcd"};Array<char *,6> a2(a);a2.sort(a[0]);a2.disp();char c[]={'a','b','C','2'};Array<char,6> a3(c);a3.sort(c[0]);a3.disp();}如果T的类型可以实例化成自定义的字符串类String类型,需要重载赋值运算符=,插入运算符<<,比较运算符>,分别用于进行字符串赋值,输出,比较。

汇编语言程序设计题库

汇编语言程序设计题库汇编语言程序设计题库一.选择题(100选20个每个1,共20分)1. 1个CPU的寻址能力为8KB,那么它的地址总线的宽度为A. 10B.11C.12D.132.在存储器中,数据和程序以形式存放。

A.二进制B.十进制C.八进制D.十六进制3.CPU要访问的某一存储单元的实际地址称A.段地址B.偏移地址C.物理地址D.逻辑地址4.某存储单元的物理地址是12345H,可以作为它的段地址的有A.2345HB.12345HC.12340HD.1234H5.设物理地址(21000H)=20H ,(21001H)=30H,(21002H)=40H。

如果从地址21001H 中取出一个字的内容是A. 2030HB.3040HC.3020HD.4030H6.在实模式下,段地址和偏移地址为3017:000A的存储单元的物理地址为()A. 3017BHB. 30170HC. 3017AHD. 30210H7.在DEBUG工具中,单步执行指令的命令是()。

A. GB. DC. TD. R8. 在DEBUG工具中,显示寄存器内容的命令是()。

A. GB. DC. TD. R9.若栈顶的物理地址为20100H,当执行完指令PUSH AX后,栈顶的物理地址为()。

A. 20098HB. 20102HC. 200FEHD. 20100H10.若栈顶的物理地址为20100H,当执行完指令POP AX后,栈顶的物理地址为()。

A. 20098HB. 20102HC. 200FEHD. 20100H11.如代数据段名为DATA_SEG,它的起始地址为20A00H,对数据段寄存器DS赋值段地址值的方法是()。

A. MOV DS,20A0HB. ASSUME DS:DATA_SEGC. DATA_SEG SEGMENTD. MOV AX,DATA_SEGMOV DS,AX12.执行PUSH BP指令时,源的操作数的物理地址表达式是()A.16*SS+BP B.16*DS+BP C.16*CS+IP D.16*SS+SP13.用户为了解决自己的问题,用汇编语言所编写的程序,称为()A目标程序B源程序C可执行程序D汇编程序14.已知AX=8065H,BX=103AH,则指令ADD BL,AL执行后,OF和CF的值分别为()。

汇编语言程序设计习题及答案

汇编语言程序设计习题及答案汇编语言程序设计习题及答案汇编语言是一种底层的计算机语言,它直接操作计算机的硬件资源。

虽然在现代计算机编程中,高级语言如C、Java等更为常见,但了解汇编语言的基本原理和编程技巧对于理解计算机底层工作原理和进行性能优化非常重要。

本文将介绍一些汇编语言程序设计的习题及其答案,帮助读者巩固和提升汇编语言编程能力。

一、基础习题1. 编写一个汇编程序,将存储器中的某个字节的值加1,并将结果存回原位置。

答案:```assemblyMOV AL, [地址]INC ALMOV [地址], AL```2. 编写一个汇编程序,计算存储器中一个数组的和,并将结果存放在指定的寄存器中。

答案:```assemblyMOV CX, 数组长度MOV BX, 数组首地址MOV AX, 0LOOP_START:ADD AX, [BX]ADD BX, 2LOOP LOOP_START```二、进阶习题1. 编写一个汇编程序,实现字符串的逆序输出。

答案:```assemblyMOV SI, 字符串首地址MOV DI, 字符串尾地址MOV CX, 字符串长度DEC CXREVERSE:MOV AL, [SI]MOV AH, [DI]MOV [DI], ALMOV [SI], AHINC SIDEC DILOOP REVERSE```2. 编写一个汇编程序,实现两个16位无符号整数的相乘,并将结果存放在指定的寄存器中。

答案:```assemblyMOV AX, 第一个数MOV BX, 第二个数MUL BX```三、挑战习题1. 编写一个汇编程序,实现一个简单的计算器,支持加法、减法、乘法和除法运算。

答案:```assemblyREAD_INPUT:; 读取用户输入; ...PARSE_INPUT:; 解析用户输入,获取操作数和运算符; ...CALCULATE:; 根据运算符进行相应的计算; ...DISPLAY_RESULT:; 将计算结果显示给用户; ...LOOP:; 循环执行计算器程序; ...```2. 编写一个汇编程序,实现一个简单的迷宫游戏,玩家通过键盘控制角色在迷宫中移动,并找到出口。

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

2小时code,2小时调试,终于把这个课程设计搞定了,主要是程序大了,要调试起来不好弄,幸亏有Debug的G和T 指令,否则都没法活了。

这个题目实际是前几个题目代码的整合,难点还是在于如何计算显示的行和列,如果错位了1个字节,显示的时候就可能出现重叠之类的情况,有得你找了。还有要再写个dword型数据转ASCII字符的程序,不过有之前的经验,应该也不难。

如果再重新写,可能会对标号进行一些管理,毕竟标号多了,显得比较混乱,可以参照一下高级语言的方法,主程序用main....end main,子程序用subXXX这种方式。。。

对于我们来说,写一个这样的程序,还是要费功夫的,但如果把这种程序给外行看,可能人家会觉得怎么就这么一个东西啊?好像还不是东西哦。。。虽然人家已经很给面子,很婉转,但听了还是心里不舒服,然后就会想,唉,汇编嘛。。。就是这样的,实现一点小功能都要搞死人。

听一个朋友说,当时搞机器语言的时候,真是感觉汇编很爽,呵,也许汇编就是让你能感觉到高级语言很爽吧,哦,不对,汇编还能破解,反编译,或者说逆向工程。。。

总的来说,个人感觉这个课程设计还是完成得较符合要求的,几百行的汇编代码,三个子程序,把一块内存里的东西结构化搬到另一块内存里,然后把结构化的数据显示出来,要转换,还有一个处理了除法溢出的子程序,最终看到的就是下面这个冬冬

好了,下面是代码:

;结构体定义 ;char year[4] // 年 ; 空格(1 Byte) ;int income (4 Bytes)// 收入 ; 空格 ;empoyer num (2 Bytes) // 雇员数 ; 空格 ;人均收入 (2 Bytes) ; 空格

; 要求:将data段的数据拷贝进table段数据,并结构化如上述格式,然后计算21年的人均收入

assume ds:data, es:table, cs:code, ss:stack data segment db '1975', '1976', '1977', '1978', '1979', '1980', '1981', '1982', '1983' db '1984', '1985', '1986', '1987', '1988', '1989', '1990', '1991', '1992' db '1993', '1994', '1995'

dd 16, 22, 382, 1356, 2390, 8000, 16000, 24486, 50065, 97479, 140417, 197514 dd 345980, 590827, 803530, 1183000, 1843000, 2759000, 3753000, 4649000, 5937000

dw 3, 7, 9, 13, 28, 38, 130, 220, 476, 778, 1001, 1442, 2258, 2793, 4037, 5635, 8226 dw 11542, 14430, 15257, 17800 data ends table segment db 21 dup ('year summ ne ?? ') table ends

display segment db 21 dup ('year summ ne ?? ') display ends

; 弄个栈,没什么用 ; 就用来有时候腾出个寄存器来用 stack segment dw 16 dup(0) stack ends

code segment start: ; 设置data段,以及ds:bx指向data段的第一个单元,即ds:[bx]的内容就是data段第一个单元的内容 mov ax, data mov ds, ax

; 设置table段 mov ax, table mov es, ax

; 设置堆栈段 mov ax, stack mov ss, ax mov sp, 16

; 初始化三个变址寄存器 mov bx, 0 mov si, 0 mov di, 0 ; 准备复制,需要用到循环,21次 mov cx, 21

s_start: ; 年 mov ax, ds:[bx+0] ; 这里写个0是为了下面的对照,清晰点 mov es:[si+0], ax mov ax, ds:[bx+2] mov es:[si+2], ax

; 空格 mov al, 32 mov es:[si+4], al

; 收入 mov ax, ds:[bx+84] mov es:[si+5], ax mov ax, ds:[bx+86] mov es:[si+7], ax

; 空格 mov al, 32 mov es:[si+9], al

; 雇员数,小心处理 mov ax, ds:[di+168] mov es:[si+0ah], ax

; 空格 mov al, 32 mov es:[si+0ch], al

; 算人均收入,这里小心高低位 mov ax, ds:[bx+84] mov dx, ds:[bx+86] push cx ; 临时用一下cx,因为不可以 div ds:[bx+168] mov cx, ds:[di+168] div word ptr cx pop cx mov es:[si+0dh], ax

; 空格 mov al, 32 mov es:[si+0fh], al

add si, 16 add bx, 4 add di, 2 ; 这里记住要加上2 loop s_start

; 上面已经将数据排列好放在table段里,table 段在es:[0] 开始 ; 下面就是要读这些数据,并计算好行列,显示在屏幕上 ; 结构化的数据按字节排列如下: ; 0123 年(字符) 4 空格(字符) 5678 收入(数据) 9 空格 A B 雇员数(数据) C 空格 D E 人均收入(数据) F 空格 ; 总共21年 ; 其中收入、雇员数、人均收入是需要转字符格式的

mov ax, display mov ds, ax

mov si, 0 mov di, 0 mov bx, 0 mov cx, 21

loop_display: push cx

; #### 年 mov si, 0 mov ax, es:[di] mov ds:[si], ax mov ax, es:[di + 2] mov ds:[si+2], ax mov ax, 0 mov ds:[si+4], ax ; 原来的显示错误,mov ds:[si+5], ax ,错一个字节都不行。。。 ; 显示年 mov dl, 20 ; 第20列 call dis

; #### 收入 mov ax, es:[di+5] ; 低16位 mov dx, es:[di+7] ; 高16位 mov si, 0 call dwtoc ; ds:si 指向字符串首地址 ; 显示收入 mov dl, 28 ; 第28列 call dis

; #### 雇员数 mov ax, es:[di+0Ah] mov si, 0 call dtoc ; 显示雇员数 mov dl, 36 ; 第36列 call dis

; ####人均收入 mov ax, es:[di+0Dh] mov si, 0 call dtoc ; 显示人均收入 mov dl, 44 ; 第44列 call dis

add di, 16 pop cx sub cx, 1 jcxz end_main jmp near ptr loop_display

end_main: mov ah, 01h int 21h

mov ax, 4c00h int 21h

; 子程序dis ; 功能:封装一些相同的操作 ; 参数:(dl) 为列数 dis: push ax push bx push cx push dx push di push si mov ax, di mov dh, 16 div dh mov dh, al add dh, 2 ; dh = di/16+2 mov si, 0 mov cl, 2 call show_str

pop si pop di pop dx pop cx pop bx pop ax ret

相关文档
最新文档