当前位置:文档之家› 汇编程序设计基础

汇编程序设计基础

汇编程序设计基础
汇编程序设计基础

汇编程序设计基础

标题:“没有风”的汇编实验报告专题(更新至10)

作者:没有风

时间: 2007-10-23,09:15

链接:

///////////////////////////////////////////////////////////////////////////////////////////

北极星2003 注:把多个实验报告合为一个专题

实验1:1楼

实验2:10/11楼

实验3:无

实验4:18楼

实验5:23/24楼

实验6:29楼

实验7:34楼

实验8:40楼

实验9:42楼

///////////////////////////////////////////////////////////////////////////////////////////

实验1 查看CPU和内存,用机器指令和汇编指令编程

1.预备知识:DEBUG的使用

在以后所有的实验中,都将用到DEBUG程序,首先学习一下它的用法。

(1)什么是DEBUG

DEBUG是DOS、WINDOWS都提供的实模式(8086方式)程序的调试工具。使用它,可以查看CPU 各种寄存器中的内容,内存的情况和在机器码跟踪程序的运行。

(2)我们用到的DEBUG功能

用DEBUG的R命令查看、改变CPU寄存器的内容:

用DEBUG的D命令查看内存中的内容:

用DEBUG的E命令改写内存中的内容:

用DEBUG的U命令将内存中的机器指令翻译成汇编指令:

用DEBUG的T命令执行一条机器指令:

用DEBUG的A命令以汇编指令的格式在内存中写入一条机器指令:

DEBUG命令比较多,共有20多个,但上述6个命令是和汇编语言学习密切相关的。在以后的实验中,我们还会用到一个P命令。

(3)进入DEBUG

DEBUG是在DOS方式下使用的程序。我们在进入DEBUG前,应先进入到DOS方式。用以下方式可以进入DOS:

①重启计算机后,进入DOS方式,此时我们进入的是实模式的DOS。

②在WINDOWS中进入DOS方式,此时进入的是虚拟8086模式的DOS。

(4)用R命令查看、改变CPU寄存器的内容

我们已知道了AX、BX、CX、DX、SS、IP这6个寄存器,现在看一下它们之中的内容,如图2.1所示。其他寄存器SP、BP、SI、DI、DS、ES、SS、FLAGS(标志寄存器)等先不予理会。

图2.31使用R命令查看CPU中各个寄存器中的内容

注意CS和IP的值,CS=0CA2,IP=0100,也就是说,0CA2=0100处的指令为CPU当前要读取、执行的指令。在所有的寄存器的下方,DEBUG还列出了CS:IP所指向的内存单元处的所存放的机器码,并将它翻译为汇编指令。可以看到,CS:IP所指向的内存单元为0CA2:0100此处存放的机器码为027548,对应的汇编指令为ADD DH,[DI+48](这条指令的含义我们还不知道,先不必探究)。

DEBUG输出的右下角还有一个信息:“DS:0048=0”,以后会进行说明,这里同样不必深究。

还可以用R命令来改变寄存器中的内容,如图2.32所示。

图2.32 用R命令修改寄存器AX中的内容

若要修改一个寄存器中的值,比如AX中的值,可以用R命令后加寄存器名来进行,输入“R AX”后按ENTER键,将出现“:”作为输出提示,在后面输入要写入的数据后按ENTER键,即完成了对AX中内容的修改。若想查看一下修改的结果,可再用R命令查看,如图2.33所示。

图2.33用R命令修改CS和IP中的内容

在图2.33中,一进入DEBUG,用R命令查看,CS:IP指向0B39:0100,此处存放的机器码为40,对应的汇编指令是INC AX.

接着,用R命令将CS修改为FF00,则CS:IP指向FF00:0200,此处存储的机器码为51,对应的汇编指令是PUSH CX。

(5)用DEBUG的R命令查看内存中的内容

用DEBUG的D命令,可以查看内存中的内容,D命令的格式较多。我们这里只介绍在以本次实验中用到的格式。

如果想知道内存10000H处的内容,可以用“D段地址:偏移地址”的格式来查看,如图2.34所示。

图2.34 用D命令查看内存1000:0处的内容

使用“D段地址:偏移地址”的格式,DEBUG将列出从指定的内存单元开始的128个内存单元的内容,图2.34中,在使用D1000:0后,DEBUG列出了1000:0~1000:7F中的内容。

使用D命令,DEBUG将输出3部分内容,如图2.34所示。

中间是部分从指定地址开始的128个内存单元的内容,用十六进制的格式输出,每行的输出从16的整数倍的地址开始,最多输出16个单元的内容。从图中,我们可以知道,内存1000:0的内容是61:内存1000:10~1000:1F中的内容全部在第一行:内存1000:10中的内容是6D,内存1000:1处的内容是61:内存1000:10~1000:1F中的内容全部在第二行。注意在每行的中间有一个“-”,它将每行的输出分为两部分,这样便于查看。比如,要想从图中找出,1000:6B单元中内容,可以从1000:60找到行,“-”前面是1000:60~1000:67的8个单元,后面是1000:68~1000:6F的8个单元,这样我们就可以从1000:68单元向后数3个单元找到1000:6B单元,可以看到,1000:6B中的内容为67H。

左边是每行的起始地址。

右边是每个内存单元中的数据对应的可以显示的ASCII码字符。比如内存单元1000:0、1000:1、1000:2中存放的数据是72H、64H、73H,它对应的ASCII字符分别是”r”、”d”、”s”;内存单元1000:36中的数据是0AH,它没有对应可显示的ASCII字符,DEBUG应用”.”来代替。

注意:我们看到的内存中的内容,在不同的计算机中是不一样的;也可能每次用DEBUG看到的内容都不相同,因为我们用DEBUG看到的都是原来就在内存中的内容,这些内容受随时都有可能心迹的系统环境的影响。当然,我们也可以改变内存,寄存器中的内容。

使用D1000:9查看1000:9处的内容,DEBUG将怎样输出呢?如图2.35所示。

图2.35查看1000:9处的内容

DEBUG从1000:9开始显示,一直到1000:88,一共是128个字节。第一行中的1000:0~1000:8单元中的内容不显示。

在一进入DEUBG后,用D命令直接查看,将列出DEBUG预设的地址的内容,如图2.36。

在使用“D段地址:偏移地址”之后,接着使用D命令,可以列出后续的内容,如图2.37所示。

图2.36 列出DEBUG预设的地址处的内容

图2.37 列出后续的内容

也可以指定D命令的查看范围,此时采用“D段地址:起始偏移地址结尾偏移地址“的格式。比如要看1000:0~1000:9中的内容,可以用”D1000:09“实现。如图2.38所示。

图2.38 查看1000:0~1000:9单元中的内容

如果我们就想查看内存单元10000H中的内容,可用图2.39中的任何一种方法看到,因为图中的所有“段地址:偏移地址“都表示了10000H这一物理地址。

图2.39 用三种不同的段地址和偏移地址查看同一个物理地址中的内容

(6)用DEBUG的E命令改写内存中的内容

可以用E命令改写内存中的内容,比如,要将内容1000:0~1000:9单元中的内容分别写为0、1、2、3、4、5、6、7、8、9,可以用它“E起始地址数据数据数据。。。“的格式来进行,如图2.40所示。

图2.40用E命令修改从1000:0开始的10个单元的内容

图2.40中,先用D命令查看1000:0~1000:F单元的内容,再用E命令修改从1000:0开始的10个单元的内容,最后用D命令查看1000:0~1000:F中的内容的变化。

也可以采用提高的方式来一个一个地改写内存中的内容,如图2.41所示。

图2.41 用E命令修改从1000:0开始的4个单元

如图2.41中,可以用E命令提高的方式来逐个地修改从某一地址开始的内存单元中的内容,以从1000:10单元开始为例,步骤如下:

①输入E1000:10,按ENTER键。

②DEBUG显示起始地址1000:0010,和第一单元(即1000:0010单元)的原始内容:6D,然后光标停在“。“的后面提示输入想要写入数据,此时可以有两个选择:其一为输入数据(我们输入的是D),然后按空格键,则不对当前内存单元进行改写。

③当前单元处理完成后(不论是改写或没有改写,只要按了空格键,就表示处理完成),DEBUG将接着显示一个内存单元的原始内容,并提示读者进行修改,读者可以用同样的方法处理。

可以用E命令向内存中写入字符,比如:用E命令从内存1000:0开始写入:数值1、字符…a?、数值3、字符…c?,可采用图2.42中所示的方法进行:

从图中2.42中可以看出,DEBUG对E命令的执行结果是,向1000:0、1000:2、1000:4单元中写入

数值1,2,3,向1000:1、1000:3、1000:5单元中写入字符”a”,”b”,”c”的ASCII码值:61H,62H,63H。也可以用E命令向内存中写入字符串,比如:用E命令从内存1000:0开始写入:数值1、字符串”a+b”、数值2、字符串”c++”、数值3、字符串”IBM”.如图2.43所示。

图2.42 用E命令向内存中写入字符

(7)用E命令向内存中写入机器码,用U命令查看内存中机器码的含义,用T命令执行内存中的机器码。

如何向内存中写入机器码呢?我们知道,机器码了是数据,当然可以用E命令将机器码写入内存。比如要从内存1000:0单元开始写入这样一段机器码:

机器码对应的汇编指令

B8 01 00 MOV AX,0001

B9 02 00 MOV CX,0002

01C8 ADD AX,CX

可用如图2.44中所示的方式进行。

图2.44 用E命令将机器码写入内存

如何查看我们写入的或内存中原有的机器码所对应的汇编指令呢?可以用U命令进行。比如可以用U命令将从1000:0开始的内存单元中的内容翻译为汇编指令,并显示出来。如图2.45所示。

图2.45中,首先用E命令向从10000:0开始的内存单元中写入了8个字节的机器码:然后用D命令查看内存1000:0~1000:1F数据(从数据的角度看一下我们写入的内容):最后用U命令查看从1000:0开始内存单元中的机器指令和它们所对应的汇编指令。

U命令的显示输出分为3部分:第一条机器指令的地址、机器指令所对应的汇编指令。我们可以看到:1000:0处存放的是我们写入的机器码B80100所组成的机器指令,对应的汇编指令是MOV AX,1:1000:3处存放的是我们写入的机器码B80C00所组成的机器指令、对应的汇编指令是ADD CX,2:1000:6处存放的是我们写入的机器码01C8所组成的机器指令、对应的汇编指令是ADD AX,CX:1000:8处存放的是内存中的机器码是034942所组成的机器指令、对应的汇编指令是ADD CX,[BX+DI+42].

图2.45 用U命令将内存单元中的内容翻译为汇编指令显示

由此,我们可以再次看到内存中的数据和代码没有任何区别,关键在于如何解释。

如何执行我们写入的机器指令?使用DEBUG的T命令可以执行一条或多条指令,简单使用T命令,可以执行CS:IP指向的指令。如图2.46所示。

图2.46 使用T命令执行CS:IP指向的指令

图2.46中,首先用E命令向从1000:0开始的内存单元中写入了8个字节的机器码:然后R命令查看CPU 中寄存器的状,可以看到CS=0B39H,IP=0100H,指向内存0B39:0100若要用T从控制CPU执行我们写到1000:0的指令,必须先让CS:IP指向1000:0;用R命令修改CS、IP中的内容,使CS:IP指

向1000:0

完成上面的步骤后,就可以使用T命令来执行我们写入的指令了(此时,CS:IP指向我们的指令所在的内存单元)。执行T命令后,CPU执行CS:IP指向的指令,则1000:0处的指令B80100(MOV AX,0001)得到执行,指令执行后,DEBUG显示输出CPU中寄存器的状态。

注意,指令执行后,AX中的内容被改写为1,IP改变为IP+3(因为MOV AX,0001的指令长度为3个单元),CS:IP指向下一条指令。

接着图2.46,我们可以继续使用T命令执行下面的指令。如图2.47所示。

图2.47用T命令继续执行

在图2.47中,用T命令继续执行后面的指令,注意每条指令执行后CPU相关寄存器内容的变化。

(8)用DEBUG的A命令以汇编指令的形式在内存中写入机器指令,直接以汇编指令的形式写入指令。为此,DEBUG提供了A命令。A命令的使用方法如图2.48所示。

图2.48用A命令向从1000:0开始的内存单元中写入指令

图2.48中,首先用A命令,以汇编语言向从1000:0开始的内存单元中写入了几条指令,然后用D命令查看A命令的执行结果,可以看到,在使用A命令写入指令时,我们输入的是汇编指令,DEBUG将这些汇编指令翻译为对应的机器指令,将它们的机器码写入内存。

在使用A命令写入汇编指令时,在给出的起始地址后面直接按ENTER键表示操作结束。

如图2.49中,简单地用A命令,从一个预设的地址开始输入指令。

图2.49 从一个预设的地址开始输入指令

本次实验中需要用到的命令

查看、修改CPU中寄存器的内容:R命令

查看内存中的内容:D命令

修改内存中的内容:E命令(可以写入数据、指令、在内存中,它们实际上没有区别)

将内存中的内容解释为机器指令和对应的汇编指令:U命令

执行CS:IP指向的内存单元处的指令:T命令

以汇编指令的形式向内存中写入指令:A命令

在预备知识中,详细讲解了DEBGU基本功能和用法,在汇编语言的学习中,DEBGU是一个经常用到的工具,在预备知识中,应该一边看书,一边在机器上操作。

前面提到,我们的原则是:以后甤的,以后再说,所以在这里只讲了一些在本次实验需要用到的命令的相关使用方法,以后根据需要,我们会讲解其它的用法。

2.实验任务

(1)使用DEBGU,将下面的程序段写入内存,逐条执行,观察每条指令执行后,CPU中相关寄存器中的内容的变化。

机器码汇编指令

B82040 MOV AX,4E20H

051614 ADD AX,1416H

BB0020 MOV BX,2000H

01DB ADD AX,BX

89C3 MOV BX,AX

01D8 ADD AX,BX

B81A00 MOV AX,001AH

BB2600 MOV BX,0026H

00D8 ADD AL,BL

00DC ADD AH,BL

00C7 AD AH,AL

6400 MOV AH,0

00D8 ADD AL,BL

049C ADD AL,9CH

提示:可以用E命令和A命令,以两种方式将指令写入内存。注意用T命令执行时,CS:IP的指向。

(2)将下面的3条指令写入从2000:0开始的内存单元中,利用这3条指令计算2的8次方。

MOV AX,1

ADD AX,AX

JMP 2000:0003

(3)查看内存中的内容

PC机主板中的ROM中写有一个生产日期,在内存FFF00H~FFFFFH的某几个单元中,请找到这个生产日期并试图改变它。

提示:如果读者对实验的结果不理解,请仔细阅读第1章的1.15节。

(4)向内存从B8100H开始的单元中填写数据,如:

-E B810:00000101020203030404

请读者:先填写不同的数据,观察产生的现象:再改变填写的地址,观察产生的现象。

提示:如果读者对实验结果不理解,请仔细阅读第1章中的1.15节。

总结:经过这次实验,我学到了许多宝贵的知识,现列举如下:

1.学会了使用R命令查看CPU中的各个寄存器的内容

2.学会了使用R命令修改各个寄存器中的内容

3.学会了使用D命令查看某寄存器中的内容

4.学会了使用D命令来列出DEBUG预设的地址及其后续地址内容

5.学会了使用多种不同的段地址和偏移地址查看同一物理地址中的内容的方法

6.学会了使用E命令修改从某地址开始的存储单元的内容

7.学会了使用E命令向内存中写入字符、字符串、机器码的方法

8.学会了使用U命令将内存单元中的内容翻译为汇编指令显示的方法

9.学会了使用T命令执行CS:IP指向的指令的方法

10.学会了使用A命令向某地址开始的单元写入指令的方法

11.学会了使用A命令向一个预设的地址输入指令的方法

12.学会了向内存中输入一段指令并执行以及观察相应寄存器的内容的变化的方法

13.学会了使用3条指令计算2的N次方的方法

14.学会了使用通过查看ROM中数据来了解自己主板的生产日期的方法

15.更深入的了解了8086将各类存储器看作一个逻辑存储器的概念

16.更深入的了解了8086机内存地址空间分配原理。

这次实验,使我受益非常大。以上是我在做实验后的一点总结心得。

实验2 用机器指令和汇编指令编程

1. 预备知识:DEBUG的使用

前面实验中,讲了DEBUG一些主要命令的用法,这里,我们再补充一些关于DEBUG的知识。

(1)关于D命令

从上次实验中,我们知道,D命令是查看内存单元的命令,可以用:

D段地址:偏移地址的格式查看指定的内存单元的内容,上次实验中,D命令后面的段地址和偏移地址都是直接给出的。

现在,我们知道段地址是放在段寄存器中的,在D命令后面直接给出段地址,是DEBUG提供的一种直观的操作方式。D命令是由DEBUG执行的,DEBUG在执行“D1000:0”这样的命令时,也会先将段地址1000送入段寄存器中。

DEBUG是靠什么来执行D命令的?当然是一段程序。

谁来执行这段程序?当然是CPU。

所以,DEBUG在其处理D命令的程序段中,必须有将段地址送入段寄存器中的代码。

段寄存器有4个:CS、DS、SS、ES,将段地址送入哪个段寄存器呢?

首先不能是CS,因为CS:IP必须指向DEBUG处理D命令的代码,也不能是SS,因为SS:SP要指向栈顶。这样只剩下DS和ES可以选择,放在哪里呢?我们知道,访问内存的指令如“MOV AX,[0]”等一般都默认段地址在DS中,所以DEBUG在执行如:“D段地址:偏移地址”这种D命令时,将段地址送入DS中比较方便。

D命令也提供了一种符合CPU机理的格式:“D段寄存器:偏移地址”,以段寄存器中的数据为段地址SA,列出从SA:偏移地址开始的内存区间中的数据。以下是4个例子:

①-R DS

:1000

-D DS:0 ;查看从1000:0开始的内存区间中的内容

②-R DS

:1000

-D DS:1018;查看从1000:10~1000:18中的内容

③-D CS:0 ;查看当前代码段中的指令代码

④-D SS:0 ;查看当前栈段中的内容

(2)在E、A、U命令中使用段寄存器

在E、A、U这些可以带有内存单元地址的命令中,也可以同D命令一样,用段寄存器表示内存单元的段地址。以下是3个例子:

①-R DS

:1000

-E DS:0 11 22 33 44 55 6 ;在从1000:0开始的内存区间中写入数据

②-U CS:0 ;以汇编指令的形式,显示当前代码段中的代码,0代码的偏移地址

③-R DS

:1000

-A DS:0;以汇编指令的形式,向从1000:0开始的内存单元中写入指令

(3)下一条指令执行了吗?

在DEBUG中,用A命令写一段程序:

MOV AX,2000

MOV SS,AX

MOV SP,10 ;安排2000:0~2000:F为栈空间,初始化栈顶。

MOV AX,3123

PUSH AX

MOV AX,3366

PUSH AX ;在栈中压入两个数据

仔细看一下图3.18中单步执行的结果,读者发现了什么问题?

在用T命令单步执行MOV AX,2000后,显示出当前CPU各个寄存器的状态和下一步要执行的指令:MOV SS,AX;

在用T命令单步执行MOV SS,AX后,显示出当前CPU各个寄存器的状态和下一步要执行的指令。。。。。,在这里我们发现了一个问题:MOV SS,AX的下一条指令应该是MOV SP,10,怎么变成了MOV AX,3123H

MOV SP,10到哪里去了?它被执行了吗?

我们再仔细观察,发现:

在程序执行前,AX=0000,SS=0B39,SP=FFEE

在用T命令单步执行MOV AX,2000后,AX=2000;SS=0B39;SP=FFEE

在用T命令单步执行MOV SS,AX后,AX=2000;SS=2000;SP=0010

注意,在用T命令单步执行MOV SS,AX前,SS=0B39,SP=FFEE,而执行后SS=2000,SP=0010,SS变为2000是正常的,这正是MOV SS,AX的执行结果。可是SP变为0010是怎么回事?在这期间,能够将SP设为0010的只有指令MOV SP,10,看来,MOV SP,10一定是得到了执行。

那么,MOV SP,10是在什么时候被执行的呢?当然是在MOV SS,AX之后,因为它就是MOV SS,AX的下一条指令。显然,在用T命令执行MOV SS,AX的时候,它的下一条指令MOV SP,10也紧接着被执行了。

整理一下我们分析的结果:在用T命令执行MOV SS,AX的时候,它的下一条指令MOV SP,10也紧接着执行了。一般情况下,用T命令执行一条指令后,会停止继续执行,显示出当前CPU各个寄存器的状态和下一步要执行的指令,但T命令执行MOV SS,AX的时候,没有做到这一点。

不单是MOV SS,AX,对于如:MOV SS,BX,MOV SS,[0],POP SS等指令都会发生上面的情况,这些指令有哪些共性呢?它们都是修改栈段寄存器SS的指令。

为什么会这样呢?要想彻底说清楚这里面来龙去脉,在这里还为时过早,因为这涉及到我们在以后的课程中要深入研究的内容:中断机制,它是我们后半部分课程中的一个主题。现在我们只要知道这一点就可以了:DEBUG的T命令在执行修改寄存器SS的指令时,一条指令也紧接着被执行。

2 实验任务

(1)使用DEBUG,将上面的程序段写入内存,逐条执行,根据指令执行后的实际运行情况填空。

MOV AX,FFFF

MOV DS,AX

MOV AX,2200

MOV SS,AX

MOV SP,0100

MOV AX,[0] AX=5BEAH

ADD AX,[2] AX=5CCAH

MOV BX,[4] BX=30FCH

ADD BX,[6] BX=6022H

PUSH AX SP=00FEH,修改的是字单元2200:00FE

PUSH BX SP=00FCH,修改的是字单元2200:00FC

POP AX SP=00FEH,AX=6022H

POP BX SP=0100H,BX=5CCAH

总结:经过这次实验我学到了许多有用的东西:分别是:

1.我掌握了使用D、U、E、A命令中可以直接使用段寄存器作为表示段地址2。我明白了在使用T命令执行修改SS段寄存器的指令时,它会紧接着执行后面的一条指令,即是说执行一次T命令将会

连续执行两条指令。

不过有一点不明白的就是,为什么在定义一个堆栈段的时候,堆栈的内容会发生变化,难道是因为系统自动对它进行初始化了吗?有人可以告诉我吗?我的QQ是420716701

[size="4"]实验4 [BX]和loop的使用

(1)编程,向内存0:200~0:23F依次传送数据0~63(3FH).

;----------------------------------------------

;ex5-1.asm

;-----------------------------------------------

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

assume cs:code ;;

code segment ;;

mov ax,20h ;;

mov ds,ax ;;

mov bx,0 ;;

mov ax,0 ;;

mov cx,0ffh ;;

s: mov [bx],ax ;;

inc bx ;;

inc ax ;;

loop s ;;

mov ax,4c00h ;;

int 21h ;;

code ends ;;

end ;;

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

(2)编程,向内存0:200~0:23F依次传送数据0~63(3FH),程序中只能使用9条指令,9条指令中包括“MOV AX,4C00H”和“INT21H”。

;-------------------------------------------

;ex5-2.asm

;-------------------------------------------

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

assume cs:code ;

code segment ;

mov ax,20h ;

mov ds,ax ;

mov bx,0 ;

mov cx,0ffh ;

s: mov [bx],bx ;

inc bx ;

loop s ;

mov ax,4c00h ;

int 21h ;

code ends ;

end ;

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

(3)下面的程序的功能是将“MOV AX,4C00H”之前的指令复制到内存0:200处,补全程序。上机调试,跟踪运行结果。

;------------------------------------------------

;;ex5-3.asm

;------------------------------------------------ ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

assume cs:code ;;;;;

code segment ;;;;;

mov ax,code ;;;;;

mov ds,ax ;;;;;

mov ax,0020h ;;;;;

mov es,ax ;;;;;

mov bx,0 ;;;;;

mov cx,18h ;;;;;

s:mov al,[bx] ;;;;;

mov es:[bx],al ;;;;;

inc bx ;;;;;

loop s ;;;;;

mov ax,4c00h ;;;;;

int 21h ;;;;;

code ends ;;;;;

end ;;;;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

1.把EX5-3.EXE加载入内存中

$debug ex5-3.exe

-r

AX=0000 BX=0000 CX=001D DX=0000 SP=0000 BP=0000 SI=0000 DI=0000 DS=13C7 ES=13C7 SS=13D7 CS=13D7 IP=0000 NV UP EI PL NZ NA PO NC 13D7:0000 B8D713 MOV AX,13D7

-u

13D7:0000 B8D713 MOV AX,13D7

13D7:0003 8ED8 MOV DS,AX

13D7:0005 B82000 MOV AX,0020

13D7:0008 8EC0 MOV ES,AX

13D7:000A BB0000 MOV BX,0000

13D7:000D B91800 MOV CX,0018

13D7:0010 8A07 MOV AL,[BX]

13D7:0012 26 ES:

13D7:0013 8807 MOV [BX],AL

13D7:0015 43 INC BX

13D7:0016 E2F8 LOOP 21

13D7:0018 B8004C MOV AX,4C00

13D7:001D 00FF ADD BH,BH

13D7:001F 50 PUSH AX

2.把0:200的内容反汇编结果如下:

13D7:000D B91800 MOV CX,0018

13D7:0010 8A07 MOV AL,[BX]

13D7:0012 26 ES:

13D7:0013 8807 MOV [BX],AL

13D7:0015 43 INC BX

13D7:0016 E2F8 LOOP 0010

13D7:0018 B8004C MOV AX,4C00

13D7:001B CD21 INT 21

13D7:001D 00FF ADD BH,BH

13D7:001F 50 PUSH AX

-u 0:200

0000:0200 46 INC SI

0000:0201 07 POP ES

0000:0202 07 ADC [BP+SI],AL

0000:0204 0A04 OR AL,[SI]

0000:0206 1002 ADC [BP+SI],AL

0000:0208 3A00 CMP AL,[BX+SI]

0000:020A A30354 MOV [5403],AX

0000:020D 00A3036E ADD [BP+DI+6E03],AH

0000:0301 00A30388 ADD [BP+DI+8803],AH

0000:0305 00A303A2 ADD [BP+DI+A203],AH

0000:0309 00A303FF ADD [BP+DI+FF03],AH

0000:0303 0310 ADD DX,[BX+SI]

0000:030F 02A90810 ADD CH,[BX+DI+1008]

-

3.运行程序至正常结束

13D7:001D 00FF ADD BH,BH

13D7:001F 50 PUSH AX

-u 0:200

0000:0200 46 INC SI

0000:0201 07 POP ES

0000:0202 07 ADC [BP+SI],AL

0000:0204 0A04 OR AL,[SI]

0000:0206 1002 ADC [BP+SI],AL

0000:0208 3A00 CMP AL,[BX+SI]

0000:020A A30354 MOV [5403],AX

0000:020D 00A3036E ADD [BP+DI+6E03],AH 0000:0301 00A30388 ADD [BP+DI+8803],AH 0000:0305 00A303A2 ADD [BP+DI+A203],AH 0000:0309 00A303FF ADD [BP+DI+FF03],AH 0000:0303 0310 ADD DX,[BX+SI]

0000:030F 02A90810 ADD CH,[BX+DI+1008]

-g 1d

Program terminated normally

-

4.再次将0:200的内容反汇编结果如下:0000:0301 00A30388 ADD [BP+DI+8803],AH 0000:0305 00A303A2 ADD [BP+DI+A203],AH 0000:0309 00A303FF ADD [BP+DI+FF03],AH 0000:0303 0310 ADD DX,[BX+SI]

0000:030F 02A90810 ADD CH,[BX+DI+1008]

-g 1d

Program terminated normally

-u 0:200

0000:0200 B8D713 MOV AX,13D7

0000:0203 8ED8 MOV DS,AX

0000:0205 B82000 MOV AX,0020

0000:0208 8EC0 MOV ES,AX

0000:020A BB0000 MOV BX,0000

0000:020D B91800 MOV CX,0018

0000:0210 8A07 MOV AL,[BX]

0000:0212 26 ES:

0000:0213 8807 MOV [BX],AL

0000:0215 41 INC BX

0000:0216 E2F8 LOOP 0210

0000:021B CD21 INT 21

0000:021D 0AC4 OR AL,AH

0000:021F 5E POP SI

对比图1和图4,我们可以看出mov ax,4c00h前的指令序列已经被复制到了0:200处

实验总结:经过这次实验,我掌握了如何将一段内存的数据复制到另一段内存中去,以及如何将程序自身的指令序列复制到另一段内存中去.掌握了如何优化程序来将内存的内容复制到另一段内存去。

这次实验,花费我大量的时间和心血,终于完成了。

实验5编写、调试具有多个段的程序

(1)将下面的程序编译连接,用debug加载、跟踪,然后回答问题:

;----------------------------------------------------------

;ex5a1.asm

;------------------------------------------------------------

;AUTHOR:IT007

;DATE:2007/11/11

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

assume cs:code,ds:data,ss:stack

data segment

dw 0123h,0456h,0789h,0abch,0defh,0fedh,0cbah,0987h

data ends

stack segment

dw 0,0,0,0,0,0,0,0

stack ends

code segment

start: mov ax,stack

mov ss,ax

mov sp,16

mov ax,data

mov ds,ax

push ds:[0]

push ds:[2]

pop ds:[2]

pop ds:[0]

mov ax,4c00h

int 21h

code ends

end start

①cpu执行程序,程序返回前,data段中的数据为多少?

答: 0123h,0456h,0789h,0abch,0defh,0fedh,0cabh,0987h

②CPU执行程序,程序返回前,cs=13D5,ss=13D4,ds=13D3.

③设程序加载后,code段的段地址为x,则data段的段地址为x-12h,stack段的段地址为x-2h.

(2)将下面的程序编译连接,用debug加载、跟踪,然后回答问题:

;----------------------------------------------------------

;ex5a2.asm

;------------------------------------------------------------

;AUTHOR:IT007

;DATE:2007/11/11

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

assume cs:code,ds:data,ss:stack

data segment

dw 0123h,0456h

data ends

stack segment

dw 0,0

stack ends

code segment

start: mov ax,stack

mov ss,ax

mov sp,16

mov ax,data

push ds:[0]

mov ax,4c00h

int 21h

code ends

end start

①cpu执行程序,程序返回前,data段中的数据为多少?

答:23 01 56 04

②cpu执行程序,程序返回前, cs=13D5,ss=13D4,ds=13D3

.

③设程序加载后,code段的段地址为x,则data段的段地址为x-12h,stack段的段地址为x-2h.

④对于如下定义的段:

name segment

………

name ends

如果段中的数据占n个字节,则程序加载后,该段实际占有的空间为n个字节.

(3)将下面的程序编译连接,用debug加载、跟踪,然后回答问题:

;----------------------------------------------------------

;ex5a3.asm

;------------------------------------------------------------

;AUTHOR:IT007

;DATE:2007/11/11

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

assume cs:code,ds:data,ss:stack

code segment

start: mov ax,stack

mov ss,ax

mov sp,16

mov ax,data

push ds:[0]

push ds:[2]

pop ds:[2]

pop ds:[0]

mov ax,4c00h

int 21h

code ends

data segment

dw 0123h,0456h

data ends

stack segment

dw 0,0

stack ends

end start

①cpu执行程序,程序返回前,data段中的数据为多少?

答:23 01 56 04

②cpu执行程序,程序返回前,cs=13D3H,ss=13D7H,ds=13D6H.

③设程序加载后,code段的段地址为x,则段的段地址为x-10h,stack段的段地址为x-10h。

(4)如果将1、2、3题中的最后一条伪指令”end start”改为”end”(也就是说,不指明程序的入口),则哪个程序仍然可以正确执行?请说明原因。

答:第3个程序可以正常运行,因为在前两个程序都未指定程序的入口,

而程序的前面一部分为数据,即非程序,当程序被加载入内存时,CS:

IP指向这些数据,即把这些数据当作指令来执行,这样可能会引发

意想不到的后果,严重的甚至可能导致死机。而第3个程序CS:

IP指向程序的第一条指令,因为数据段定义在程序的末尾,因而程

序可以正常执行。

(5)程序如下,编写code段中的代码,将a段和b段中的数据依次相加,将结果存到c段中。

;----------------------------------------------------------

;ex5a5.asm

;------------------------------------------------------------

;DATE:2007/11/11

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

assuem cs:code,ds:a,es:b

a segment

db 1,2,3,4,5,6,7,8

a ends

b segment

db 1,2,3,4,5,6,7,8

b ends

c segment

db 0,0,0,0,0,0,0,0

c ends

code segment

start:

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

;以下为我添加的代码

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

mov ax,a

mov ds,ax

mov ax,b

mov es,ax

mov bx,0

mov di,0

mov cx,8

mov ax,0

s: mov al,[bx]

add al,es:[bx]

mov [bx+32],al

inc bx

loop s

mov ax,4c00h

int 21h

code ends

end start

(6)程序如下,编写code段中的代码,用push指令将a段中word数据,逆序存储到b段中。 ;----------------------------------------------------------

;ex5a6.asm

;------------------------------------------------------------

;AUTHOR:IT007

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

assume cs:code

a segment

dw 1,2,3,4,5,6,7,8

a ends

b segment

dw 0,0,0,0,0,0,0,0

b ends

code segment

start:

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

;以下为我添加的代码

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

mov ax,a

mov ds,ax

mov ax,b

mov ss,ax

mov sp,10h

mov bx,0

mov cx,8

s:

push [bx]

add bx,2

loop s

mov ax,4c00h

int 21h

code ends

end start

总结:经过实验5,我掌握了以下知识:

①我学会了如何将一个段和附加寄存器关联,并将之设置为附加数据段

②我学会了如何使用END伪指令设置IP为一个程序的入口的偏移地址

③我学会了如何程序的数据的段并不是一定要放在程序的前面,它也可以放在程序的末尾,只是这时程序的IP即为程序的入口的偏移地址。

④我学会了如何依次将两个数组的元素相加,并把结果依次存储到另一个数组中去。

⑤我学会了如何使用MOV指令将一个字节单元的内存传送到8位寄存器中去。

⑥我学会了如何使用ADD指令将一个字节型单元的内容加到一个8位寄存器中去。

⑦我学会了如何读取附加段字节型单元的内容到一个8位寄存器中去。

⑧我学会了如何使用循环(至少执行一次的循环)。

⑨我学会了如何使用PUSH指令将一个数组的元素逆序COPY到一个堆栈(或说为数组应该也没什么大碍吧)中去。

心得:在这次实验当中,可以说作为一个初学者该犯的错误我都犯了,比如:试图将一个字型单元的内容读取到一个堆栈中去(这明显是不支持的嘛,PUSH指令怎么说也是一个字操作指令:),还有就是试图使用字操作指令进行字节操作(这明显是不能实现的嘛:),不过只要想相应的寄存器改为8位寄存器就支持了,还有就是忘了在程序的最后加上返回系统的指令(一个程序运行结束之后如果不返回调用它的程序,或操作系统或DEBUG,那么它该去哪里呢?我不知道,也许会发生意想不到的事情吧:)。

这次实验最大的收获就是终于掌握了独立编写一个汇编程序的能力,能解决一些日常遇到的小问题,如将一个数组逆序,将一个数组的元素COPY到另一个数组中去。在使用PUSH指令的过程中也让我更加深刻理解了堆栈的运行机制。

总结:经过实验5,我掌握了以下知识:

①我学会了如何将一个段和附加寄存器关联,并将之设置为附加数据段

②我学会了如何使用END伪指令设置IP为一个程序的入口的偏移地址

③我学会了如何程序的数据的段并不是一定要放在程序的前面,它也可以放在程序的末尾,只是这时程序的IP即为程序的入口的偏移地址。

④我学会了如何依次将两个数组的元素相加,并把结果依次存储到另一个数组中去。

⑤我学会了如何使用MOV指令将一个字节单元的内存传送到8位寄存器中去。

⑥我学会了如何使用ADD指令将一个字节型单元的内容加到一个8位寄存器中去。

⑦我学会了如何读取附加段字节型单元的内容到一个8位寄存器中去。

⑧我学会了如何使用循环(至少执行一次的循环)。

⑨我学会了如何使用PUSH指令将一个数组的元素逆序COPY到一个堆栈(或说为数组应该也没什么大碍吧)中去。

心得:在这次实验当中,可以说作为一个初学者该犯的错误我都犯了,比如:试图将一个字型单元的内容读取到一个堆栈中去(这明显是不支持的嘛,PUSH指令怎么说也是一个字操作指令:),还有就是试图使用字操作指令进行字节操作(这明显是不能实现的嘛:),不过只要想相应的寄存器改为8位寄存器就支持了,还有就是忘了在程序的最后加上返回系统的指令(一个程序运行结束之后如果不返回调用它的程序,或操作系统或DEBUG,那么它该去哪里呢?我不知道,也许会发生意想不到的事情吧:)。

这次实验最大的收获就是终于掌握了独立编写一个汇编程序的能力,能解决一些日常遇到的小问题,如将一个数组逆序,将一个数组的元素COPY到另一个数组中去。在使用PUSH指令的过程中也让我更加深刻理解了堆栈的运行机制。

实验6实践课程中的程序

(1)将课程中所有讲解过的程序上机调试,用DEBUG跟踪其执行过程,并在过程中进一步理解所讲内容。

(2)编程:完成问题中的程序。

问题:编程,将datasg段中的每个单词的前四个字母改为大写字母:

;---------------------------

;pro9.asm

;---------------------------

;AUTHOR:没有风

;DATE:2007/11/18 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

;功能:将4个单词的前4个字母转换为大写字母;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

;

;语言:8086,编译工具:masm5.00

; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

assume cs:codesg,ss:stacksg,ds:datasg

stacksg segment

dw 0,0,0,0,0,0,0,0

stacksg ends

datasg segment

str0 db '1. display '

str1 db '2. brows '

str2 db '3. replace '

str3 db '4. modify '

datasg ends

codesg segment

start: mov ax,stacksg

mov ss,ax

mov sp,16

mov ax,datasg

mov ds,ax

mov bx,0

程序设计基础官方版

三、程序设计基础 下面我们这一节我们概要向用户管理人员介绍面问过程的程序设计语言的原理。绝大多数生产程序是用诸如COBOL、BASIC这样的POL编制的。虽然用户管理人员通常没有机会去实际地从事这类编程序的工作,但是他(或者她)将经常与从事这些工作的人们相互联系。掌握程序设计的基础知识将使得这种相互联系更加有效,同时也使得管理人员能够理解查询语言的概念。 在POL中,一个指令(又称作语句)序列是一条接着一条执行的,除非用一条“条件测试”指令来控制执行顺序而转移到程序的另一部分。例如,一个工资程序处理按月发工资的职工与按工时发工资的职工的两部分程序是不同的。计时职工的毛工资是计算出来的,而按月发工资的职工其每月的毛工资是从数据库中检索出来的。对每种工作(按工时计算或按月计算)都要求一组唯一的指令。一旦确定了毛工资,那么对二者的处理步骤(即程序指令)是相同的(例如,工资扣除、社会保险金额的计算、打印工资支票等等)。 在图20.7.4中,我们从一个BASIC工资程序中挑选出一些关键的语句用以说明程序设计中的“序列”和“条件测试”的概念。这些指令是自我说明了。编制一个计算和打印工资的联单的实际程序将要求几百行代码(LOC)或指令。 每种POL都有自己的一组指令集,其中,对下面一般的指令分类的每一类至少有一条指令。 (1)计算指令。计算指令允许程序员作加、减、乘、除和一个数的乘方(见图20.7.) 中的语句120)等运算。 图20.7.4 一个BASIC工资程序的关键语句 (2)数据传送指令。它可以将数据从主存的一个单元传送到另一个单元。赋值语句也属这一类,这些语句允许程序员通过一个命名的存储单元(称作为一个变量)使用一个常字“NETPAYIS”,或一个数值。在图20.7.4的例子中,“S$”引用了用来存贮工资码的主存单元的内容,工时比率存放在一个用“R”来引用的主存单之中。语句160是一个赋值语句,

C++程序设计基础课后答案 第八章

8.1 阅读下列程序,写出执行结果 1.#include class Bclass { public: Bclass( int i, int j ) { x = i; y = j; } virtual int fun() { return 0 ; } protected: int x, y ; }; class Iclass:public Bclass { public : Iclass(int i, int j, int k):Bclass(i, j) { z = k; } int fun() { return ( x + y + z ) / 3; } private : int z ; }; void main() { Iclass obj( 2, 4, 10 ); Bclass p1 = obj; cout << p1.fun() << endl; Bclass & p2 = obj ; cout << p2.fun() << endl; cout << p2.Bclass :: fun() << endl; Bclass *p3 = &obj;

cout << p3 -> fun() << endl; } 2.#include class Base { public: virtual void getxy( int i,int j = 0 ) { x = i; y = j; } virtual void fun() = 0 ; protected: int x , y; }; class A: public Base { public: void fun() { cout<<"x = "<

西交大《程序设计基础》试题及答案

西交大《程序设计基础》试题及答案 一、单项选择题(本大题共20小题,每小题2分,共40分) 1.int a[10];合法的数组元素的最小下标值为()。A:10 B:9 C:1 D:0 答案:D 2.以下运算符中优先级最低的是()。A:&& B:& C:|| D:| 答案:C 3.若使用一维数组名作函数实参,则以下正确的说法是()。A:必须在主调函数中说明此数组的大小B:实参数组类型与形参数组类型可以不匹配C:在被调用函数中,不需要考虑形参数组的大小D:实参数组名与形参数组名必须一致答案:A 4.已知函数的调用形式:fread(buffer,size,count,fp);其中buffer 代表的是()。 A:一个整数,代表要读入的数据项总数B:一个文件指针,指向要读的文件C:一个指针,指向要读入数据的存放地址D:一个存储区,存放要读的数据项答案:C 5.对以下说明语句int a[10]={6,7,8,9,10}; 的正确理解是()。A:将5个初值依次赋给a[1]至a[5] B:将5个初值依次赋给a[0]至a[4] C:将5个初值依次赋给a[6]至a[10] D:因为数组长度与初值的个数不相同,所以此语句不正确答案:B 6.下列程序的输出结果是()。main() { int x=1,y=0,a=0,b=0; switch(x) { case 1:switch(y) { case case } case 2:a++;b++;break; case 3:a++;b++;break; } printf(\} A:a=1,b=0 B:a=2,b=1 C:a=1,b=1 D:a=2,b=2 答案:B 7.下列程序的输出结果为()。main() {int m=7,n=4; float a=38.4,b=6.4,x; x=m/2+n*a/b+1/2; printf(\ 0:a++;break; 1:b++;break; } A:27.000000 B:27.500000 C:28.000000 D:28.500000 答案:A 8.若k为int型变量,则以下程序段的执行结果是()。k=-8567; printf(\A:格式描述符不合

计算机程序设计基础习题册(含答案)

《计算机程序设计基础》 习 题 册

班级学号姓名成绩一、单选题 1.C++源程序文件的默认扩展名为A。 A) cpp B) exe C) obj D) lik 2.由C++源程序文件编译而成的目标文件的默认扩展名为C。 A) cpp B) exe C) obj D) lik 3.由C++目标文件连接而成的可执行文件的默认扩展名为B。 A) cpp B) exe C) obj D) lik 4.编写C++程序一般需经过的几个步骤依次是B。 A)编译、编辑、连接、调试 B)编辑、编译、连接、调试 C)编译、调试、编辑、连接 D)编辑、调试、编辑、连接 5.程序中主函数的名字为 A 。 A) main B) MAIN C) Main D) 任意标识符 6.下面四个选项中,均是不合法的用户标识符的选项的是C。 A) A p_o do B)float lao _A C)b-a goto int D)_123 temp INT 7.下列变量名中合法的是C。 A) B)C)Tom B) 3a66 C) _6a7b D) $ABC 8.存储以下数据,占用存储字节最多的是 D 。 A) 0 B) ‘0’ C) “0” D) 0.0 9.在C++语言中,字符型数据在内存中的存储形式是D。 A) 补码 B) 反码 C) 原码 D) ASCII码 10.若有说明语句:char c =’\072’;则变量c A。 A) 包含1个字符 B) 包含2个字符 C) 包含3个字符 D) 说明不合法,变量的值不确定 二、填空题 1.C++头文件和源程序文件的扩展名分别为.h和.cpp 。 2.C++语言规定,标识符只能由字母、数字、下划线三种字符组成,而且第一个字符必须是字母或下划线。 3.一条表达式语句必须以__分号_;___作为结束符。 4.用于从键盘上为变量输入值的标准输入流对象是___cin____;用于输出表达式值的标准输出流对象是__cout____。 5.在一个C++程序文件中,若要包含另外一个头文件或程序文件,则应使用以_#include___标识符开始的预处理命令

计算机科学导论第4章 程序设计基础(答案)

第4章程序设计基础 习题 一、选择题 1. A 2.D 3.C 4. A 5. B 6.D 7.A 8.B 9.C 10. B 11. D 12. A 13.B 14.D 15.C 二、简答题 1.结构化程序设计的思想是什么? 答:结构化程序设计的基本思想就是采用自顶向下、逐步求精的设计方法和单入口单出口的控制结构。 2.结构化程序设计的原则是什么? 答:结构化程序设计的原则是: (1) 使用顺序、选择、循环3种基本控制结构表示程序逻辑。 (2)程序语句组织成容易识别的语句模块,每个模块都是单入口、单出口。 (3)严格控制GOTO语句的使用。 3.结构化程序设计语言采用自顶向下的方法进行程序设计的特点是什么? 答:利用结构化程序设计语言采用自顶向下的方法进行程序设计的特点是: (1) 问题分解成子问题的结构必须与3种基本程序结构之一相对应。 (2) 问题的划分决定了程序的结构。一方面,子问题的划分决定了这一层次的程序是3种基本结构中的哪一种结构;另一方面,一个问题该如何划分成子问题是灵活的,并不是只有一种分解方法。分解的好坏就决定了设计的质量,也决定了程序的不同结构。 (3) 问题的边界应该清晰明确。只有这样才能精确地解决这些子问题,否则就会模棱两可,无从下手。 4.简述面向对象和结构化程序设计的区别。 答:面向对象是从本质上区别于传统的结构化方法的一种新方法、新思路。它吸收了结构化程序设计的全部优点,同时又考虑到现实世界与计算机之间的关系,认为现实世界是由一系列彼此相关并且能够相互通信的实体组成,这些实体就是面向对象方法中的对象,每个对象都有自己的自然属性和行为特征,而一类相似对象的共性的抽象描述,就是面向对象方法中的核心——类。 5. 从互联网上面搜索选择结构的使用方式。 答案略。 6.简述模块化方法的原理。

《计算机程序设计基础》课后练习题参考答案

《计算机程序设计基础》课后练习题1 一.判断题 (1)(错)事件过程由某个用户事件或系统事件触发执行,但不能被其他过程调用。 (2)(错)若X=2, Y=5,则表达式 Y-2>X AND X+2>Y 的结果为:True。 (3)(错)常量是指在程序运行过程中其值可以改变的那些量。 (4)(错,timer没有)VB工具箱中的所有控件都具有宽度(Width)和高度(Height)属 性。 (5)(错)定义变量:Dim max,min as Single , 则max 和 min 的数据类型均为Single。 (6)(对)如果创建的菜单项的标题是一个减号“-”,则该菜单项显示为一条分隔线。 (7)(错)标准模块文件的扩展名是“*.VBP”。 (8)(错,都不能)定时器控件可以响应Click事件,但不能响应DbClick事件。 (9)(错)在默认情况下,数组下标下界的缺省值为1。 (10)(对)在使用字体对话框时,需要对其Flags属性先进行相应设置。 二.单选题 (11)在Visual Basic中,表示鼠标单击事件的是 C 。 A)Activate B)DoubleClick C)Click D)MouseDown (12)用于设置计时器时间间隔的属性是 A 。 A)Interval B)Name C)Left D)Top (13)函数Int(10*Rnd)是在 D 范围内的整数。 A)[1,10] B)[1,10] C) [0,9) D)[0,9] (14)Select case语句结构的结尾应使用 D 。 A)End B) End Case C) End Sub D) End Select (15)改变了容器的坐标系后,该容器的 A 属性值不会改变。 A)left B)scaleleft C)scaletop D)scalewidth (16)执行下列语句后,列表框中各表项顺序为 D List1.Clear For i=1 to 4 : List1.AddItem i-1,0 :Next i A)B)C)D) (17)输入对话框InputBox的返回值的类型是 A 。

程序设计基础

程序设计基础 公司内部编号:(GOOD?TMMT?MMUT?UUPTY?UUYY ?DTTI?

考点1程丿宇设计的方法与风格 【考点精讲】 养成良好的程丿子设计风格,主要考虑下述因素: 1.源程序文档化 (1)符号名的命名:符号名的命名应具有一定的实际含义,以便于对程序功能的理解。 (2)程序注释:在源程序中添加正确的注释可帮助人们理解程序。 程序注释可分为序言性注释和功能性注释。 (3)视觉组织:通过在程序中添加一些空格、空行和缩进等,使人们在视觉上对程序的结构一目了然。 2.数据说明的方法 为使程序中的数据说明易于理解和维护,可采用下列数据说明的风格,见表 2-lo 表2-1 数据说明风格 3.语句的结构程序应该简单易懂,语句构造应该简单直接。

4.输入和输出

考点2结构化程序设计 【考点精讲】 1.构化程序设计的原则 结构化程序设计方法引入了工程思想和结构化思想,使大型软件的开发和编程得到了极大的改善。结构化程序设计方法的主要原则为:H顶向下、逐步求精、模块化和限制使用got。语句。 自顶向上:先考虑整体,再考虑细节;先考虑全局目标,再考虑局部目标。 逐步求精:对复杂问题应设计一些子目标作为过渡,逐步细化。 模块化:把程序要解决的总目标分解为分目标,再进一步分解为具体的小目标,把每个小目标称为一个模块。 限制使用goto语句:在程序开发过程中要限制使用goto语句。 2.结构化程序的基本结构 结构化程序的基本结构有三种类型:顺序结构、选择结构和循环结构。 顺序结构:是最基本、最普通的结构形式,按照程序中的语句行的先后顺序 逐条执行。 选择结构:又称为分支结构,它包括简单选择和多分支选择结构。 循环结构:根据给定的条件,判断是否要重复执行某一相同的或类似的程序段。循环结构对应两类循环语句:先判断后执行的循环体称为当型循环结构;先执行循环体后判断的称为直到型循环结构。 考点3面向对象方法

Java程序设计基础习题答案

Java程序设计基础课后习题参考答案 第2章 1、关于Java Application得入口方法main()得检验: main()方法得参数名就是否可以改变? main()方法得参数个数就是否可以改变? 该方法名就是否可以改变? 参考答案:(1)main()方法得参数名可以改变.(2)main()方法得参数个数不可以改变。(3)该方法名不可以改变。 2、当一个程序没有main()方法时,能编译吗?如果能编译,能运行吗? 参考答案:当一个程序没有main()方法就是,就是可以编译通过得,但就是不能给运行,因为找不到一个主函数入口。 3、下列语句能否编译通过? bytei =127; bytej = 128; longl1 = 999999; long l2= 9999999999; 参考答案:byte i 与long l1可以编译通过。而byte j 与longl2 超出自身数据类型范围,所以编译失败。 4、下列语句能否编译通过? float f1 =3、5; float f2 = 3.5f; 参考答案:java中浮点型得数据在不声明得情况下都就是double型得,如果要表示一个数据就是float型得,必须在数据后面加上“F”或“f”;因此,floatf1 无法编译通过。 5、验证int 与char,int与double等类型就是否可以相互转换。 参考答案:(1)char类型可以转换为int 类型得,但就是int类型无法转换为char类型得;(2)int 可以转换为double类型得,但就是double类型无法转换为int 类型得。 6、计算下列表达式,注意观察运算符优先级规则。若有表达式就是非法表达式,则指出不合法之处且进行解释。 (1)4+5 == 6*2 ?(2) (4=5)/6?? (3)9%2*7/3>17(4)(4+5)<=6/3 ? (5) 4+5%3!=7-2????(6)4+5/6〉=10%2 参考答案:表达式(2)为不合法表达式,只能将值赋值给一个变量,因此其中(4=5)将5赋值给4就是不合法得. 7、下列()就是合法得Java标识符。 (1)Counter1 ??(2)$index, (3) name-7 ??(4)_byte

程序设计基础实践课目标要求

程序设计基础 课程实践目标要求 一、课程实践目标 程序设计基础课程实践是督促和检验学生程序设计综合能力的教学环节,通过课程实践使学生综合使用所学过的C语言程序设计知识,掌握结构化程序设计的基本思路和方法,在所掌握的基本知识和技能的基础上,进一步提高自学能力和查找资料的能力,解决一定程度的复杂的结构化程序设计问题,加深对所学知识的理解与掌握,增强学生利用自己所学知识解决实际问题的能力,为以后的程序开发打下基础。 课程实践的目的和要求: 1、使学生巩固和加强《C语言程序设计》课程的理论知识。 2、使学生掌握C语言的基本概念、语法、语义和数据类型的使用特点。 3、使学生掌握C语言程序设计的方法及编程技巧,能正确使用C语言编写程序。 4、进一步理解和运用结构化程序设计的思想和方法;学会利用传统流程图或N-S图表示算法。 5、使学生掌握调试程序的基本方法及上机操作方法。 6、掌握书写程序设计开发文档的能力,使学生学会撰写课程实践总结报告。课程实践的思想和方法还可以作为学生做毕业论文时的参考资料。 7、通过查阅手册和文献资料,培养学生独立分析问题和解决问题的能力。为学生做毕业设计打好基础。 8、初步掌握开发一个小型实用系统的基本方法:结合实际应用的要求,使课程实践既覆盖知识点,又接近工程实际需要。通过激发学习兴趣,调动学生主动学习的积极性,并引导他们根据实际编程要求,训练自己实际分析问题的能力及编程能力,并养成良好的编程习惯。 9、培养学生的创新能力和创新思维。学生可以根据指导书和相关文献上的参考算法,自己设计出相应的应用程序。 10、培养学生良好的程序设计风格。在实际编程中,为了提高编程质量,对空行、空格和注释均有要求。学生在课程实践书写代码时,应该严格按要求处理,以便建立良好的程序设计风格。 二、课程实践内容 1.基本要求 ⑴课程实践题目选一,可以协商合作,但每名同学必须完成每个功能函数,甚至每条语句的作用。只有了解了整个程序设计思路,每个函数、设置每条语句的作用,才达到开“计算机与程序设计语言”这门课的目的。

程序设计基础练习题(全答案版)

《程序设计基础——C#.NET》练习 参考答案: 一、选择题 https://www.doczj.com/doc/b312033493.html,的目的就是将____A____作为新一代操作系统的基础,对互联网的设计思想进行扩展。A.互联网 B. Windows C. C# D. 网络操作系统 2.假设变量x的值为10,要输出x值,下列正确的语句是__C__。 A.System.Console.writeline(“x”) B. System.Cosole.WriteLine(“x”) C. System.Console.WriteLine(“x={0}”,x) D. System.Console.WriteLine(“x={x}”) 3.要退出应用程序的执行,应执行下列的_A___语句。 A. Application.Exit(); B. Application.Exit; C. Application.Close(); D. Application.Close; 4.关于C#程序的书写,下列不正确的说法是__D________。 A.区分大小写 B.一行可以写多条语句 C.一条语句可以写成多行 D.一个类中只能有一个Main()方法,因此多个类中可以有多个Main()方法 5. 在C#语言中,下列能够作为变量名的是__C__。 A.if B. 3ab C. b_3a D. a-bc 7. 能正确表示逻辑关系“a≥5或a≤0”的C#语言表达方式是__D__。 A.a>=5 or a<=0 B. a>=5|a<=0 C. a>=5&&a<=0 D. a>=5||a<=0 8. 以下程序的输出结果是___C_____。 A. 5 B. 4 C. 6 D. 不确定 9. If语句后面的表达式应该是__A___。 A.逻辑表达式 B. 条件表达式 C. 算术表达式 D. 任意表达式10.有如下程序:

程序设计基础(知识点)

第三部分程序设计基础 3.1 程序、程序设计、程序设计语言的定义 ⑴程序:计算机程序,是指为了得到某种结果而可以由计算机等具有信息处理能力的装置执行的代码化指令序列,或者可以被自动转换成代码化指令序列的符号化指令序列或者符号化语句序列。 ⑵程序设计:程序设计是给出解决特定问题程序的过程,是软件构造活动中的重要组成部分。程序设计往往以某种程序设计语言为工具,给出这种语言下的程序。程序设计过程应当包括分析、设计、编码、测试、排错等不同阶段。 ⑶程序设计语言:程序设计语言用于书写计算机程序的语言。语言的基础是一组记号和一组规则。根据规则由记号构成的记号串的总体就是语言。在程序设计语言中,这些记号串就是程序。程序设计语言有3个方面的因素,即语法、语义和语用。 3.2 高级语言和低级语言的概念及区别 ⑴高级语言:高级语言(High-level programming language)是高度封装了的编程语言,与低级语言相对。

它是以人类的日常语言为基础的一种编程语言,使用一般人易于接受的文字来表示(例如汉字、不规则英文或其他外语),从而使程序编写员编写更容易,亦有较高的可读性,以方便对电脑认知较浅的人亦可以大概明白其内容。 ⑵低级语言:低级语言分机器语言(二进制语言)和汇编语言(符号语言),这两种语言都是面向机器的语言,和具体机器的指令系统密切相关。机器语言用指令代码编写程序,而符号语言用指令助记符来编写程序。 ⑶区别: 高级语言:实现效率高,执行效率低,对硬件的可控性弱,目标代码大,可维护性好,可移植性好低级语言:实现效率低,执行效率高,对硬件的可控性强,目标代码小,可维护性差,可移植性差 了解知识:CPU运行的是二进制指令,所有的语言编写的程序最终都要翻译成二进制代码。越低级的语言,形式上越接近机器指令,汇编语言就是与机器指令一一对应的。而越高级的语言,一条语句对应的指令数越多,其中原因就是高级语言对底层操作进行了抽象和封装,

计算机程序设计基础习题册含答案

《计算机程序设计基础》 计算机程序设 计基础_基础知识(一) 班级 学号 姓名 成 绩 一、 单选题 习题册

1.C++源程序文件的默认扩展名为A。 2.A) cpp B) exe C) obj D) lik 3.由C++源程序文件编译而成的目标文件的默认扩展名为C。 4.A) cpp B) exe C) obj D) lik 5.由C++目标文件连接而成的可执行文件的默认扩展名为B。 6.A) cpp B) exe C) obj D) lik 7.编写C++程序一般需经过的几个步骤依次是B。 8.A)编译、编辑、连接、调试 B)编辑、编译、连接、调试 C)编译、调试、编辑、连接 D)编辑、调试、编辑、连接9.程序中主函数的名字为 A 。 10.A) main B) MAIN C) Main D) 任意标识 符 11.下面四个选项中,均是不合法的 用户标识符的选项的是 C。 12.A) A p_o do B)float lao _A C)b-a goto int D)_123 temp INT 13.下列变量名中合法的是 C。 14.A) B)C)Tom B) 3a66 C) _6a7b D) $ABC 15.存储以下数据,占用存储字节最 多的是 D 。 16.A) 0 B) ‘0’

C) “0” D) 17.在C++语言中,字符型数据在内存中的存储形式是D。 18.A) 补码 B) 反码 C) 原码 D) ASCII码 19.若有说明语句:char c =’\072’;则变量c A。 20.A) 包含1个字符 B) 包含2个字符 C) 包含3个字符 D) 说明不合法,变量的值不确定 二、填空题 1.C++头文件和源程序文件的扩展名分别为.h和.cpp 。 2.C++语言规定,标识符只能由字母、数字、下划线三种字符组成,而且第一个字符必须是字母或下划线。 3.一条表达式语句必须以__分号_;___作为结束符。 4.用于从键盘上为变量输入值的标准输入流对象是___cin____;用于输出表达式值的标准输出流对象是__cout____。 5.在一个C++程序文件中,若要包含另外一个头文件或程序文件,则应使用以_#include___标识符开始的预处理命令 计算机程序设计基础_基础知识(二) 班级学号姓名成绩 一、单选题 1.下列哪一个是C++语言中合法的变量 C A) 8ZSe B) ±A0 C) X0_2 D) ’x0’2.已知ch是字符型变量,下面不正确的赋值语句是A 3.A) ch='a+b' B) ch='\0'

程序设计基础C复习资料(1)

一、填空题。 1、微型计算机的运算器、控制器及内存储器组合在一起,称之为(D) A、ALU B、CPU C、MPU D、主机 2、信息的最小单位是(A ) A、bit B、byte C、KB D、word 3、Windows操作系统是(C ) A、单用户、单任务 B、多用户、单任务 C、单用户、多任务 D、多用户、多任务 4、下列数据中最大数是(D) A、(1010010)2 B、(123.4)8 C、(84.5)10 D、(55)16 5、设有int a=3,b=-4,c=5;表达式(a

程序设计基础试题(附答案)

程序设计基础复习题 一、单选 1、一个完整的计算机系统应该包括() A、系统软件和应用软件 B、计算机及其外部设备 C、硬件系统和软件系统 D、系统硬件和系统软件 2、“裸机”的概念是指() A、正在进行设计还没有组装好的计算机 B、已经组装好但还没有安装任何软件的计算机 C、仅安装了操作系统的计算机系统 D、安装了文字处理软件但没有安装专用数据处理系统的计算机 3、世界上第一台电子数字计算机研制成功的时间是() A、1936年 B、1946年 C、1956年 D、1970年 4、CASE的含义是() A、计算机辅助设计 B、计算机辅助制造 C、计算机辅助教学 D、计算机辅助软件工程5、当前广泛使用的微型计算机是() A、第一代 B、第二代 C、第三代 D、第四代 6、当代计算机的体系结构称为是() A、冯·诺依曼机 B、非冯·诺依曼机 C、图灵机 D、比尔盖茨机 7、硬盘是() A、输入设备 B、输出设备 C、存储设备 D、计算设备 8、下面4句话中,最准确的表述是() A、程序=算法+数据结构 B、程序是使用编程语言实现算法 C、程序的开发方法决定算法设计 D、算法是程序设计中最关键的因素

9、计算机能直接执行的语言是() A、机器语言 B、汇编语言 C、高级语言 D、目标语言 10、解释程序的功能是() A、将高级语言程序转换为目标程序 B、将汇编语言程序转换为目标程序 C、解释执行高级语言程序 D、解释执行汇编语言程序 11、下面4种程序设计语言中,不是面向对象式语言的是() A、JAVA B、Object Pascal C、Delphi D、C 12、不是C语言的基本数据类型是() A、int B、double C、char D、bool 13、在C语言中,为了求两个整数相除之后得到的余数,可以使用运算符() A、/ B、% C、* D、++ 14、数据的逻辑结构分为() A、纯属结构和非线性结构 B、顺序结构和非顺序结构 C、树型结构和图型结构 D、链式结构和顺序结构 15、用链表表示纯属表的优点是() A、便于随机存取 B、便于插入和删除操作 C、花费的存储空间较顺序存储少 D、元素的物理顺序与逻辑顺序相同 16、栈的最主要特点是() A、先进先出 B、先进后出 C、两端进出 D、一端进一端出 17、下面4句结论只有一句是错误的,它是()

Visual Basic 程序设计基础教程-课后习题答案-范荣强

第一章程序与编程环境 一、填空题 1. 工程,Form_Load 2. 事件(触发) 3. 窗体,Name 4. CurrentX, CurrentY 5. maxButton, BorderStyle = 1 or 3 or 4 or 5 6. Alignment, 空缺,AutoSize 7. Style, LoadPicture 8. Line, Shape 9. 重画10. FillStyle ll. MultiLine, maxLength, Locked 12. Font 13. sub, 对象名,事件名14. 方法,Object.Method, text1.setfocus() 15. Name, minButtom, CurrentX(Y), Caption 16. Interval, Enable 17. timer, Interval, ms(毫秒) 18. Mouse Down, Click, LoastFocus 19. .Frm, .Frx, .bas. cls. Vbp 20. 注释, “Rem 语句”或者“’语句” 第二章数据的类型、表示以及运算 一、请指出下列哪些是VB的合法常量,并说明原因 (1)√(2)X 常量不能加类型说明符号改成123.4 (3)X与上题类似,如果是常量,则类型说明符放在后面(4)√等价于2E3 (5) √(6)√等于十进制的4113 (7)X 如果是16进制要写&符号(8)X 指数不能为小数(9)X 月份超过12,日超过31 (10)√(11)√(12)√等价于上一题(13)X 8进制数每一位不能超过8 (14)√(15)X 变量,常量要为基本数据类型的值(16)√ 二、找出合法变量 (1)√(2)√如果与控件Label1同在一个应用程序里面,该变量会屏蔽掉控件Label1 (3) X 保留字(4)√(5)X 变量不能以数字开头(6)变量不能有小数点 (7)√(8)√数组变量(9)X保留字(10)√可以,但rnd()不可以,rnd()是函数 (11) √(12)√(13)√(14)X ’符号表示注释(15)X 这是表达式,不是变量(16)X 同上,是表达式 三、指出下列数据x,y,z的声明是否正确,如果正确请指明其类型 (1)√ x--long, y—variant, z—integer (2) √ x—long, y—long, z—integer (3) √ x—double, y—double, z—integer (4) X 变量x &中间不能有空格 (5)√自动转换成字符串 (6)X 变量声明不能直接赋值 (7)√ (8)√自动转换成字符串 (9)X 常量不能把函数写上去 (10)√ 四、写出下列表达式的结果 (1)1 (2) 1 (3)false (4) ab12 (5)123 (6)出错,加法表达式中如果有一个是数值类型,则“+”表示加号,而不是字符的链接符号(7)False (8)true (9) true (10) false 默认转换成相同类型(数值),建议这里把2改成D试试 (P.S. 布尔类型TRUE = -1, FALSE = 0; 优先顺序:^(乘方)→-(求负)→*、/→\(整除)→MOD→+、-) 五、写出下列函数的结果

程序设计基础

第二章程序设计基础 2.1 程序设计设计方法和风格 如何形成良好的程序设计风格 1、源程序文档化; 2、数据说明的方法; 3、语句的结构; 4、输入和输出。 注释分序言性注释和功能性注释,语句结构清晰第一、效率第二。2.2 结构化程序设计 结构化程序设计方法的四条原则是:1. 自顶向下;2. 逐步求精;3.模块化;4.限制使用goto语句。 结构化程序的基本结构和特点: (1)顺序结构:一种简单的程序设计,最基本、最常用的结构;(2)选择结构:又称分支结构,包括简单选择和多分支选择结构,可根据条件,判断应该选择哪一条分支来执行相应的语句序列;(3)重复结构:又称循环结构,可根据给定条件,判断是否需要重复执行某一相同程序段。 2.3 面向对象的程序设计 面向对象的程序设计:以60年代末挪威奥斯陆大学和挪威计算机中心研制的SIMULA语言为标志。 面向对象方法的优点: (1)与人类习惯的思维方法一致; (2)稳定性好; (3)可重用性好; (4)易于开发大型软件产品; (5)可维护性好。 对象是面向对象方法中最基本的概念,可以用来表示客观世界中的任何实体,对象是实体的抽象。 面向对象的程序设计方法中的对象是系统中用来描述客观事物的一个实体,是构成系统的一个基本单位,由一组表示其静态特征的属性和它可执行的一组操作组成。 属性即对象所包含的信息,操作描述了对象执行的功能,操作也称为方法或服务。 对象的基本特点: (1)标识惟一性; (2)分类性; (3)多态性; (4)封装性; (5)模块独立性好。 类是指具有共同属性、共同方法的对象的集合。所以类是对象的抽象,对象是对应类的一个实例。 消息是一个实例与另一个实例之间传递的信息。 消息的组成包括(1)接收消息的对象的名称;(2)消息标识符,也称消息名;(3)零个或多个参数。 继承是指能够直接获得已有的性质和特征,而不必重复定义他们。

(完整版)程序设计基础试题_10_答案

广州大学学年第学期考试卷 课程高级语言程序设计考试形式(开/闭卷,考试/查) 学院系专业班级学号姓名 一、填空题(每空1分,共10分) 1.C源程序的基本单位是(函数)。 2.一个C源程序中至少应包含一个(main()函数)。 3.若a和b均是int型变量,且a和b的初值均为5,则计算表达式a+=b++ 后,a的值为(10 ),b的值为( 6 )。 4.若a、b和c均是int型变量,则计算表达式a=(b=4)+(c=2)后,b值为( 4 ),c 值为( 2 )。 5.表达式8.2-2/3 的计算结果是(8 )。 6.在C语言中,整数可用三种数制表示,它们分别是(十进制)、(八进制)和(十六进制)。 二、程序计算题(每小题5分,共15分) 1. # define f(a) printf(“%d”,a) main() { int i,b[]={1,2,3,5,7,9,11,13,15},*p=5+b; for(i=3;i;i--) switch(i) { case 1: case 2: f(*p++); break;

case 3: f(*(--p)); } } 2. main() { int arr_sum(int arr[],int n); int a[3][4]={1,3,5,7,9,11,13,15,17,19,21,23}; int *p,total; int (*pt)( int arr[],int n); pt=arr_sum; p=a[0]; total=(*pt)(p,12); printf(“total=%d\n”,total); } arr_sum(int arr[],int n) { int i,sum=0; for(i=0;i

C++程序设计基础(第4版)(上)习题解答

《C++程序设计基础》(第4版)(上) 习题与解答 第1章基本数据与表达式 1.1 选择题 1.一个最简单的C++程序,可以只有一个(C )。 (A)库函数(B)自定义函数(C)main函数(D)空函数 2.用C++语言编写的源程序要成为目标程序必须要经过(D )。 (A)解释(B)汇编(C)编辑(D)编译3.C++程序中的简单语句必须以(B )结束。 (A)冒号(B)分号(C)空格(D)花括号4.假设有说明int a=0; double x=5.16;,则在以下语句中,(C )属于编译错误。 (A)x=a/x; (B)x=x/a; (C)a=a%x; (D)x=x*a; 5.执行C++程序时出现的“溢出”错误属于(C )错误。 (A)编译(B)连接(C)运行(D)逻辑 6.在下列选项中,全部都是C++关键字的选项为(C )。 (A)while IF Static (B)break char go (C)sizeof case extern (D)switch float integer 7.按C++标识符的语法规定,合法的标识符是(A )。 (A)_abc (B)new (C)π(D)"age" 8.在C++语句中,两个标识符之间(A )不能 ..作为C++的分隔符。 (A)数字(B); (C): (D)+ 9.下列正确的八进制整型常量表示是(B )。 (A)0a0 (B)015 (C)080 (D)0x10 10.下列错误的十六进制整型常量表示是(C )。 (A)0x11 (B)0xaf (C)0xg (D)0x1f 11.在下列选项中,全部都合法的浮点型数据的选项为(B )。 (A)-1e3.5 15. 2e-4 (B)12.34 -1e+5 0.1E-12 (C)0.2e-2 -12345. e-5 (D)5.0e(1+4)0.1 8e+2 12.在下列选项中,正确的字符常量为(D )。 (A)"a" (B)'name' (C)a (D)'\101' 13.在下列选项中,(D )不能 ..交换变量a和b的值。 (A)t=b; b=a; a=t; (B)a=a+b; b=a-b; a=a–b; (C)t=a; a=b; b=t; (D)a=b; b=a; 14.关于下列语句,叙述错误的是(A )。

相关主题
文本预览
相关文档 最新文档