文档库 最新最全的文档下载
当前位置:文档库 › 华科汇编语言程序设计实验3

华科汇编语言程序设计实验3

华科汇编语言程序设计实验3
华科汇编语言程序设计实验3

课程实验报告

课程名称:汇编语言程序设计实验

实验名称:实验三模块化程序设计

实验时间:2017-4-5,14:30-17:30 实验地点:南一楼804室98号实验台

指导教师:班鹏新

专业班级:计算机科学与技术201503班

学号:U201514558姓名:刘伟光

同组学生:无报告日期:2017年4月5日

原创性声明

本人郑重声明:本报告的内容由本人独立完成,有关观点、方法、数据和文献等的引用已经在文中指出。除文中已经注明引用的内容外,本报告不包含任何其他个人或集体已经公开发表的作品或成果,不存在剽窃、抄袭行为。特此声明!

学生签名:

日期:2017.4.5

成绩评定

指导教师签字:

日期:

目录

1实验目的与要求 (1)

2实验内容 (1)

3实验过程 (2)

3.1任务1 (2)

3.1.1设计思想及存储单元分配 (2)

3.1.2流程图 (2)

3.1.3源程序 (3)

3.1.4实验步骤 (8)

3.1.5实验记录与分析 (8)

3.2任务2 (12)

3.2.1设计思想及存储单元分配 (12)

3.2.2流程图 (12)

3.2.3源程序 (12)

3.2.4实验步骤 (15)

3.2.5实验记录与分析 (15)

4总结与体会 (18)

1实验目的与要求

(1)熟掌握子程序设计的方法与技巧,熟悉子程序的参数传递方法和调用原理;

(2)掌握宏指令、模块化程序的设计方法;

(3)掌握较大规模程序的合作开发与调试方法;

(4)掌握汇编语言程序与C语言程序混合编程的方法;

(5)熟悉C编译器的基本优化方法;

(6)了解C语言编译器的命名方法,主、子程序之间参数传递的机制。

2实验内容

任务1 宏与子程序设计

程序执行时首先显示一个功能菜单:选择1=录入学生姓名和各科考试成绩,2=计算平均分,3=计算排名,4=输出成绩单,5=程序退出。

2人一组,一人负责包括菜单显示、程序退出在内的主程序,以及菜单中的功能1和2;另一人负责菜单中的功能3和4。各自汇编自己的模块,然后连接生成一个程序。

录入学生姓名和各科考试成绩时,首先显示录入的是第几个学生的信息,然后分别在提示之后输入姓名和各科成绩(可以借鉴书上十进制转二进制的子程序F10T2)。所有学生信息录入完毕后回到菜单显示的位置。姓名及考试成绩的存放、平均分的计算,按照实验二的要求。

排名的基本要求是按照平均成绩从高到低计算名次,也可以考虑按照指定课程的成绩排名。相同平均分时排名相同,下一个相邻平均分的排名应该是排名在前的所有人数和的下一个数值。输出成绩单的基本要求是依次显示每个学生的姓名、平均成绩和排名,也可以考虑按照指定课程、指定进制的形式显示(可以借鉴书上二进制转十进制的子程序F2T10)。

将9号和10号DOS系统功能调用定义成宏指令并调用。

任务2:在C语言程序中调用汇编语言实现的函数

对于任务1的程序进行改造,主控程序、以及输入输出等功能用C语言实现,其他功能用独立的汇编语言子程序的方式实现;在C语言程序中调用汇编语言子程序。

3实验过程

3.1任务1

3.1.1设计思想及存储单元分配

此次任务使用的数据段分配比较简单,一开始就用MENU来存放显示菜单的字符串,并以$结尾,此次还使用了两个宏定义,分别是WRITE和READ,分别用来输出和输入数据。BUF用以存放5位学生的基本信息,前十个字节用来存放学生姓名,后三个用来存放语文,数学,英语成绩。后两个用来存放平均成绩和排名。FUN11、CHINESE、MATH、ENGLISH、SUC作为提示信息。Inname作为输入学生姓名的缓冲区,GRADE作为输入学生姓名的缓冲区。

3.1.2流程图

1.开始界面设计流程图如图3.1.1所示

3.1.1开始界面的程序流程图

2.学生信息输入流程图如图

3.1.2所示

3.1.2模块一的程序流程图

3.模块二计算平均分流程图如图3.1.3

3.1.3模块二的程序流程图3.1.3源程序

;编写者:刘伟光同组人:刘智博,王国瑞

NAME WAN12

EXTRN WAN3:NEAR,WAN4:NEAR

.386

STACK SEGMENT USE16 STACK

DB 500 DUP(0)

STACK ENDS

DATA1 SEGMENT USE16 PARA PUBLIC 'D1'

N EQU 5

MENU DB 0AH,0DH,' |---------------Menu---------------|'

DB 0AH,0DH,' | 1.input the information |'

DB 0AH,0DH,' | 2.Calculated average |'

DB 0AH,0DH,' | 3.Calculated order |'

DB 0AH,0DH,' | 4.Print the table |'

DB 0AH,0DH,' | 5.quit the program |'

DB 0AH,0DH,' |----------------------------------|',0AH,0DH,'$'

BUF DB N DUP(16 DUP(0)) ;前十个用来存放姓名FUN11 DB 0AH,0DH,' Please input the name:$'

CHINESE DB 0AH,0DH,' Please input the chinese grade:$' MATH DB 0AH,0DH,' Please input the math grade:$' ENGLISH DB 0AH,0DH,' Please input the english grade:','$'

SUC DB 0AH,0DH,' Fuction Success$'

CRLF DB 0DH,0AH,'$' ;回车换行

GRADE DB 3

DB ?

DB 3 DUP(0)

inname DB 11

DB ?

DB 11 DUP(0)

BUF10 DB 15 DUP(0)

DATA1 ENDS

CODE SEGMENT USE16 PARA PUBLIC 'CODE' ;代码段

ASSUME CS:CODE,DS:DATA1,SS:STACK

START: MOV AX,DATA1

MOV DS,AX

MOV AX,STACK

MOV SS,AX

WRITE MACRO A ;输出功能的宏定义

PUSH DX ;保护现场

PUSH AX

LEA DX,A

MOV AH,9

INT 21H

POP AX

POP DX

ENDM

READ MACRO A ;输入功能的宏定义

PUSH DX ;保护现场

PUSH AX

LEA DX,A

MOV AH,10

INT 21H

POP AX

POP DX

ENDM

MAIN: WRITE MENU ;输出菜单

MOV AH,1

INT 21H

WRITE CRLF

MOV CX,0

CMP AL,31H

JZ FUN1

CMP AL,32H

JZ FUN2

CMP AL,33H

JZ FUN3

CMP AL,34H

JZ FUN4

CMP AL,35H

JZ FUN5

FUN1: MOV DL,CL ;cx用作计数器

ADD DL,30H ;DL做提示用的数字的ASCII码

INC DL

MOV AH,2

INT 21H

MOV DL,3AH

MOV AH,2

INT 21H ;提示第几个学生

;输入学生姓名

WRITE FUN11 ;提示输入姓名

READ inname

MOV AL,inname+1

MOV AH,0

MOV SI,0

LOOPA:MOV BX,CX ;BX是当前学生的前一个

IMUL BX,16 ;BX表示当前学生姓名首字母偏移地址

MOV DL,inname[SI+2]

MOV BUF[BX+SI],DL ;转移字符串

INC SI

CMP SI,AX

JNZ LOOPA

MOV BUF[BX+SI],24H

;输入学生语文成绩

WRITE CHINESE

READ GRADE

MOV AX,WORD PTR GRADE+2

SUB AL,30H

MOV DL,AL

MOV DH,0

IMUL DX,10 ;对十位数的处理

SUB AH,30H ;对个位数的处理

ADD AH,DL

MOV BUF[BX+10],AH

;输入学生数学成绩

WRITE MATH

READ GRADE

MOV AX,WORD PTR GRADE+2

SUB AL,30H

MOV DL,AL

MOV DH,0

IMUL DX,10 ;对十位数的处理

SUB AH,30H ;对个位数的处理

ADD AH,DL

MOV BUF[BX+11],AH

;输入学生英语成绩

WRITE ENGLISH

READ GRADE

MOV AX,WORD PTR GRADE+2

SUB AL,30H

MOV DL,AL

MOV DH,0

IMUL DX,10 ;对十位数的处理

SUB AH,30H ;对个位数的处理

ADD AH,DL

MOV BUF[BX+12],AH ;存放

INC CX ;循环控制

WRITE CRLF

CMP CX,N

JNZ FUN1

MOV AH,1

INT 21H

MOV AX,03H ;清屏

INT 10H

JMP MAIN

FUN2: MOV AX,0

MOV DX,0

MOV BX,CX

IMUL BX,16 ;计算所在位置

ADD BX,10

MOV DL,BUF[BX]

ADD DL,DL

ADD AX,DX

INC BX

MOV DL,BUF[BX]

ADD AX,DX

INC BX

MOV DL,BUF[BX]

SAR DL,1

ADD AX,DX ;总成绩

SAL AX,1

MOV DL,7

DIV DL

INC BX

MOV BUF[BX],AL

INC CX

CMP CX,N

JNZ FUN2

LEA DX,SUC

MOV AH,9

INT 21H

MOV AH,1

INT 21H

MOV AX,03H ;清屏

INT 10H

JMP MAIN

FUN3: MOV SI, OFFSET BUF

CALL WAN3

LEA DX,SUC

MOV AH,9

INT 21H

LEA DX,CRLF

MOV AH,9

INT 21H

MOV AH,1

INT 21H

MOV AX,0003H ;清屏

INT 10H

JMP START

FUN4: MOV SI, OFFSET BUF

MOV DI, OFFSET BUF10

CALL WAN4

LEA DX,SUC

MOV AH,9

INT 21H

LEA DX,CRLF

MOV AH,9

INT 21H

MOV AH,1

INT 21H

MOV AX,0003H ;清屏

INT 10H

JMP START

FUN5: MOV AH,1

INT 21H

MOV AH,4CH

INT 21H

GRADEP PROC

MOV AL,GRADE+1

MOV AH,0 ;成绩长度存储在AX中

CMP AX,3

JZ LOOP3

CMP AX,2

JZ LOOP2

CMP AX,1

JZ LOOP1

LOOP3: MOV BUF[BX+DI],64H

RETN

LOOP2: MOV AX,WORD PTR GRADE+2

SUB AL,30H

MOV DL,AL

MOV DH,0

IMUL DX,10 ;对十位数的处理

SUB AH,30H ;对个位数的处理

ADD AH,DL

MOV BUF[BX+DI],AH ;存放

RETN

LOOP1: MOV AL,GRADE+2

SUB AL,30H

MOV BUF[BX+DI],AL

RETN

GRADEP ENDP

CODE ENDS

END START

3.1.4实验步骤

1.准备上机环境,编辑、汇编、连接文件4。

2.按F9来执行程序文件。

3.进行功能一的测试,窗口提示输入要查找的学生的姓名,在窗口中输入姓名。成功后,再

直接敲入回车,测试功能。

4.运行功能二,测试功能。

5.(思考题)美化菜单

6.(思考题)跟踪到子程序内部,在TD中观察子程序调用和返回时堆栈的变化。在进入子程

序的时候观察堆栈区的值的变化

7.(思考题)观察公共符号的定义和外部符号的引用,若符号名不一致或类型不一致时的现

象。

8.(思考题)观察EXTRN说明语句放在.386之前或者之后的区别。

9.(思考题)总结过程中所遇到的错误。

3.1.5实验记录与分析

1.实验环境条件:P3 1GHz,256M内存;WINDOWS 10下DOSBox0.72;EDIT.EXE

2.0;MASM.EXE 6.0;LINK.EXE 5.2; TD.EXE 5.0。

2.程序开始菜单如图

3.1.4所示:

图3.1.4程序开始菜单

3.模块一输入学生信息如图3.1.5所示:

图3.1.5输入学生信息

4.模块二计算平均成绩如图3.1.6所示:

图3.1.6计算平均成绩

5.模块四打印成绩如图3.1.7所示:

图3.1.6计算平均成绩

分析:测试样例:姓名:zhang,语文成绩:60,数学成绩:70,英语成绩:80;姓名:li,语文成绩:50,数学成绩:40,英语成绩:30;姓名:liu,语文成绩:90,数学成绩:85,英语成绩:75;姓名:sun,语文成绩:86,数学成绩:76,英语成绩:66;姓名:wang,语文成绩:50,数学成绩:60,英语成绩:70;

理论输出:姓名:zhang,平均成绩:65,排名:3;姓名:li,平均成绩:44,排名:5;

姓名:liu,平均成绩:86,排名:1;姓名:sun,平均成绩:80,排名:2;姓名:wang,平均成绩:55,排名:4;

由运行结果可知,代码的输出功能正确。

6.(思考题)追踪子程序观察堆栈段变化,如图3.1.8,3.1.9所示:

图3.1.8调用子程序前的堆栈段

图3.1.9进入子程序后的堆栈段

分析:已知调用子程序的下一句是IP地址为000D,显然在调用子程序的时候,程序将子

程序的出口的IP压入堆栈段,等到子程序运行完毕return的时候,将IP地址出栈,根据堆栈段中的IP地址作为自己下一步的IP。

7.(思考题)观察FAR、NEAR类型子程序的RET指令的机器码,far类型如图3.1.10和3.1.11。

图3.1.10进入far子程序前的代码段和堆栈段

图3.1.11进入far子程序前的代码段和堆栈段

分析:far类型子程序相比near型子程序,在前面多了0b0c,仔细观察是代码段cs的内容,进入子程序后,先把子程序的出口的IP压入堆栈段,再将代码段中的内容压入堆栈段。

8.(思考题)观察公共符号的定义和外部符号的引用,若符号名不一致或类型不一致的现象,将主程序文件中的wan3:near改成wan5:near,再将主文件中所有的wan3改成wan5,link连接时发生以下错误,错误如图3.1.12所示。

图3.1.12使用错误的公共类型发生的错误

分析:当多个模块的公告定义不同时,虽然在编译各个文件的时候不会出错误,但是在连接程序的时候会发生找不到wan5扩展的错误。

9.(思考题)观察EXTRN说明语句放在.386之前或者之后的区别,将EXTRN说明语句放到.386后面观察运行,运行结果如下:

图3.1.13进入far子程序前的代码段和堆栈段

分析:经过各个方面的测试,验证说明更改后的语句依旧能正常运行。

10.(思考题)观察宏定义在反汇编中的扩展,源代码如图3.1.14,反汇编如图3.1.15

图3.1.13原汇编代码

图3.1.13反汇编中宏定义的展开

分析:调用宏定义在反汇编中会直接展开。

11.总结错误一,这个是比较低级的错误,在刚开始组接模块的时候,漏掉了对于模块三和模

块四的扩展语句,导致程序编译时发生错误,错误如图3.1.14。

10.

11.图3.1.14缺少entrn语句时代码编译发生的错误

12.总结错误二,基址加变址寻址的经典错误,这是我第二次栽在这个坑里面了,基址只能使用

bx,bp,IR只能选择SI,DI,正确及错误输入的方式如下:

图3.1.15错误的使用基址加变址寻址

图3.1.15正确的使用基址加变址寻址

分析:对于基址加变址寻址的学习还是需要加深,熟练掌握应当使用哪些寄存器不该使用哪些寄存器。

3.2任务2

3.2.1设计思想及存储单元分配

这次的程序由C语言部分和汇编程序构成,使用的IDE是vs2017,程序中调用汇编的子程序,在C语言中构建学生的结构,其中名字用十个字符类型保存,三门成绩和平均成绩用char型来存储,目的是为了和汇编中当初的数据结构相匹配,最后用一个short int型来保存该学生的名次。

3.2.2流程图

1.任务二流程图如图3.

2.1所示

3.2.1开始界面的程序流程图

3.2.3源程序

#include

#include

typedefstruct {

char name[10];

char mark[4];

short rank;

}st;

extern"C"void WAN2(st *stu);

extern"C"void WAN3(st *stu);

st stu[5];

char out[4] = { 0,0,0,0 };

int change;

int input(void) {

int j;

for (j = 0; j <= 4; j++)

{

printf("please input the name :");

scanf("%s", stu[j].name);

printf("please input the Chinese grade :");

scanf("%d", &change);

stu[j].mark[0] = (char)change;

printf("please input the math grade :");

scanf("%d", &change);

stu[j].mark[1] = (char)change;

printf("please input the English grade :");

scanf("%d", &change);

stu[j].mark[2] = (char)change;

printf("输入完成\n");

getchar();

}

return 0;

}

void output(void) {

int j;

for (j = 0; j <= 4; j++)

{

printf("the name is \n");

printf("%s", stu[j].name);

printf("his/her average grade is ");

out[0] = stu[j].mark[3];

change = (int)out[0];

printf("%d\n", change);

printf("The order is: \n%d\n", stu[j].rank);

getchar();

}

}

int main(void) {

int op = 1;

while (op)

{

system("cls");

printf("\n\n");

printf("\t\t\t.............Menu...............\n");

printf("\t\t\t 1. Input the information.\n");

printf("\t\t\t 2.Calculated average.\n");

printf("\t\t\t 3.Calculated order\n");

printf("\t\t\t 4.Print the table\n");

printf("\t\t\t 0.quit.\n");

printf("\t\t\t................................\n");

scanf("%d", &op);

switch (op) {

case 1:

input();

getchar();

break;

case 2:

WAN2(stu);

getchar();

break;

case 3:

WAN3(stu);

getchar();

break;

case 4:

output();

getchar();

break;

case 0:

break;

}

}

}

3.2.4实验步骤

1.准备上机环境,编辑、汇编、运行vs生成解决方案。

2.使用ml编译两个模块文件,生成两个obj文件。

3.使用vs建立解决方案,建立一个项目,将c的源文件和两个obj的文件导入进vs中。

4.生成解决方案,使用vs进行跟踪调试。

5.观察调用汇编子程序时的反汇编代码。

6.(思考题)探讨c语言中调用汇编子程序时,对汇编子程序是否敏感。

7.总结实验中的错误。

3.2.5实验记录与分析

1.实验环境条件:P3 1GHz,256M内存;WINDOWS 10下VS 2017;MASM32;

2.程序开始菜单如图

3.2.2所示:

图3.2.2程序开始菜单

3.输入学生信息如图3.2.3所示:

图3.2.3输入学生信息

4.模块二计算平均成绩如图3.2.4所示:

图3.2.4计算平均成绩

5.模块三排序如图3.2.5所示:

图3.2.5对学生成绩进行排序

6.模块四打印成绩如图3.2.6所示:

图3.2.6计算平均成绩

分析:测试样例:姓名:zhang,语文成绩:60,数学成绩:70,英语成绩:80;姓名:li,语文成绩:50,数学成绩:40,英语成绩:30;姓名:liu,语文成绩:90,数学成绩:85,英语成绩:75;姓名:sun,语文成绩:86,数学成绩:76,英语成绩:66;姓名:wang,语文成绩:50,数学成绩:60,英语成绩:70;

理论输出:姓名:zhang,平均成绩:65,排名:3;姓名:li,平均成绩:44,排名:5;

姓名:liu,平均成绩:86,排名:1;姓名:sun,平均成绩:80,排名:2;姓名:wang,平均成绩:55,排名:4;

由运行结果可知,代码的输出功能正确。

7.(思考题)观察c与汇编混合的反汇编程序如图3.2.7所示:

图3.2.7观察c与汇编混合的反汇编程序

分析:c语言中每句代码都可以转化为相对应的汇编语句,发现比如输入输出都对应的有vs中的汇编子函数,调用的自己写的汇编子程序则放在写的c程序下面。

8.(思考题)观察当调用子程序使用不同大小写时,汇编程序是否会对其敏感。将代码中调用子程序的名字改为小写,运行程序如图3.2.8:

图3.2.8c调用汇编子程序时对大小写敏感

9.总结错误1:当熟悉的使用masm对两个模块进行编译时,错误的将16位的obj文件加入到项目当中,造成vs无法打开文件报错。错误如图图3.2.9

图3.2.9编译器报错

分析:对于16位和32位程序,其差异还是很大的。

10.总结错误2:在第一次试验的时候错误地认为将所有的16位寄存器都改为了32位寄存器,

导致输出成绩表的时候没办法显示名字。经过分析,如果将32位的值直接赋到排名当中的话,会刚好导致下一位学生开头的值变为0,使其没有办法输出。

图3.2.10错误的将32位寄存器的值赋给排名

总结:对于汇编程序,还是要更加的仔细小心。

4总结与体会

这次的实验加深了我们对汇编语言模块化编程的能力,同时还促进了我们对于宏定义和子函数使用的能力。初次接到模块化的任务,起初还是觉得很简单的。但是真正的开始敲代码的时候才发现事情并没有这么的简单。这次的任务相比于任务二又是一次难度上质的飞越,尤其是和队友代码的连接上,需要有很好的独立性,也要规定好传参的方式,否则两块代码在衔接程度上很难连接。在我们两个代码初次在一起的时候调试出了很多的错误,其中一个很大的错误就是设置的数据段的名字不一样,会导致没有办法正常的使用数据段。所以,这次实验十分考察了我们的团队协作的能力。同时又是我们的代码更加的具有独立性,使其成为真正独立的模块。

在这次实验,我更加认识到了宏定义的便捷性,宏定义在程序中是直接代入展开的,个人感觉比子程序的定义和调用好用一些。尤其是用write和read来输入输出变量的时候,感觉使代码简洁了许多。对跨文件的对于子程序的调用使我第一次碰到的,经过思考题的思考,我发现在调用子程序的时候,会将call子程序的下一句的IP地址压入到堆栈段中去,当extrn语句将模块设为far时,还将其的代码段寄存器的内容压入堆栈中,当子程序调用完毕的时候,按照栈顶的IP进行return。

这次代码中出现的困难点主要是将数字字符串转化成数字的子函数,还有就是如何将三个模块都连接在一起。在技术上出现的问题主要就是关于寻址方式的问题,这个问题之前就一直困扰着我,通过这次的不断训练和更正,我相信我会熟记寄存器的各种使用方式。

任务二又再次拓宽了我的视野,让我学会了如何在c程序中使用汇编子程序。我觉得这次最帮助我的地方就是让我真切的意识到了汇编代码的运用的地方其实不是我们想象的那样。汇编直接插入到C语言中会使关键的部分会使c语言的运行效率大大提高。32位程序的编写使我意识到了汇编在程序编程中的重要地位。这次的实验也使我掌握了一项新技能,即在c语言中使用汇编代码。

在连接中我们更加的需要谨慎,每一步都需要认真地检查,我在开始时就因为连接部分的代码写的不够谨慎导致连接多次失败。这次实验最让我头痛的其实是编译器的选择,在这次的实验当中,我选了很多编译器,编译器不同真的导致许多方面都不同。我最先开始使用的是BC,后面又使用dev软件中自带的gcc,发现都很不好使用,我的VS2017当初没有新加c++的支持所以出现错误,在对其进行更新之后对其再次进行操作最终得以成功。不同的编程语言是可以协同解决一个问题的,而且可以利用不同语言的特点来更好地解决问题。

微机原理试卷(华中科技大学)

微机原理试卷 (照片整理版) 一、计算题 1、十进制数205的二进制数、十六进制数、BCD码分别是多少? 答:205D=11001101B=CDH=001000000101BCD 2、设X=5AH,Y=0B3H,试计算:X异或Y,X或Y。 答:(过程:X=01011010, Y=10110011, X异或Y=11101001=E9H X或Y=11111011=FBH) 答案:E9H和FBH 3、给定一个堆栈区,其地址为:1250H:0000H~1250H:0100H,(SP)=0052H, 请问:1.栈顶地址是什么?2.栈底地址是什么?在堆栈段SS中的段 地址?3.若存入数据2456H,数据在内存中如何存放?此时SP的 内容是什么? 答:1.栈顶地址:12500H 2.栈底地址:12600H CS:1250H 3.24 存到1252H单元,56存到1250H单元SP=0050H 二、基本概念题 1、8K X4位的存储器分别需要13根地址线和4根数据线,从地址线 A0到地址线A n,地址线每增加一根A n+1,则寻址范围增加2n+1-2n B. 2、计算机存储单元中存储的数据值超过了机器字长所能表示的范围称为 溢出,下述机器数形式可表示的数值范围是:单字节无符号整数 0~255,单字节有符号整数-128~127。(用十进制表示) 3、八片16K x4的存储器芯片可以设计为存储容量32K的16位存储体。 4、宏汇编语言程序被汇编时,程序汇编语句产生代码指令,伪指令 语句不产生代码指令,宏指令语句可能产生也可能不产生代码指令。 5、一个较完善的指令系统应包括数据传送类指令,算术运算类 指令,逻辑运算类指令,程序控制类指令,字符串类指令和系统控制类指令。 6、堆栈是一种特殊的数据存储寻址方式,遵循后进先出的原则,设 SP=00A8H,如果用栈操作指令压入三个数据,则SP变为00A2H;若有用 栈操作指令弹出两个数据,则SP又变为00A6H。 7、形成操作数地址的方式,称为寻址方式,当CPU访问外部存储器或 I/O端口时有哪几种典型寻址方式:立即寻址、寄存器寻址、直接寻址、 寄存器间接寻址,变址寻址、基址变址寻址、相对基址加变址寻址。这些寻址方式的操作会在时序上产生总线周期。 8、片内单元的选择由直接连接到存储器或I/O端口芯片的从A0开始的地 位地址经片内译码电路完成,实现存储器内存单元或I/O接口单元片内寄存器端口的选择。而存储器或I/O端口芯片的选通信号由高位地址线经组合逻辑或译码电路完成,实现不同芯片地址空间的分配。(注:

实验四-循环结构汇编语言程序的设计实验报告

循环结构汇编语言程序设计实验报告

实验四循环结构汇编语言程序设计 一、实验目的 1、学习循环结构的汇编语言程序的设计和调试。 2、学习通过直接对8086计算机的寄存器和存的直接访问,编写更高效简洁的汇编程序。 3、加深掌握计算机整体的工作过程。 3、加深对排序算法的理解。 二、实验任务 编写程序求出数组A中(20个元素)的最大值和最小值(数组没有排序)。 要求至少采用二种不同的排序算法来实现。( 快速排序,归并排序、堆排序、Shell排序、插入排序、冒泡排序、交换排序、选择排序、基数排序……) 三、实验容 为了更好地实现老师所布置的实验任务,我们根据情况选取以下两种方式实

验。 1、利用冒泡排序的方式求解数组A中元素的最大值最小值。设计流程图如 下所示: 2、利用选择排序的方式求得数组A中元素的序列。设计流程图如下所示:

四、实验环境 PC机: winXP/win7(32位)/win7(64位)+winxp 虚拟机 汇编工具:Masm.exe+Link.exe。 五、实验步骤 1)建立和生成的文件 (1)编写的源程序,源程序名为abc、扩展名为.asm (2)源程序经汇编程序Masm.exe汇编(翻译)后生成二进制目标程序,文件名为abc.obj (3)目标程序需要经Link.exe连接生成可执行程序,文件名为abc.exe 2)汇编环境 最基本的汇编环境只需要两个文件:Masm.exe和Link.exe。将这两个文件拷入到已经建好的文件夹(例如 huibian)中,并将文件夹huibian放在硬盘根

目录C :\>下 3)上机步骤 进入DOS窗口中执行。 4)调试程序 进入DEBUG后,调试程序 5)调试成功后重新汇编、连接并生成可执行代码 6)执行程序,并对运行结果截图。 利用冒泡排序求得数组A中元素的最大值最小值的实验结果如下图所示:(说明:输入数据为:13,0,59,900,587,1,657,234,34,48) 利用选择排序对数组A中元素排序得到的序列得实验结果如下图所示:(说明:输入数据为13,0,59,900,587,1,657,234,34,48)

华科_计算机系统实验报告

课程实验报告课程名称:计算机系统基础 专业班级: 学号: 姓名: 指导教师: 报告日期:年月日 计算机科学与技术学院

目录 实验1: (1) 实验2: (7) 实验3: (24) 实验总结 (34)

实验1:数据表示 1.1 实验概述 实验目的:更好地熟悉和掌握计算机中整数和浮点数的二进制编码表示。 实验目标:加深对数据二进制编码表示的了解。 实验要求:使用有限类型和数量的运算操作实现一组给定功能的函数。 实验语言:c。 实验环境:linux 1.2 实验内容 需要完成bits.c中下列函数功能,具体分为三大类:位操作、补码运算和浮点数操作。 1)位操作 表1列出了bits.c中一组操作和测试位组的函数。其中,“级别”栏指出各函数的难度等级(对应于该函数的实验分值),“功能”栏给出函数应实现的输出(即功能),“约束条件”栏指出你的函数实现必须满足的编码规则(具体请查看bits.c中相应函数注释),“最多操作符数量”指出你的函数实现中允许使用的操作符的最大数量。 你也可参考tests.c中对应的测试函数来了解所需实现的功能,但是注意这些测试函数并不满足目标函数必须遵循的编码约束条件,只能用做关于目标函数正确行为的参考。 表1 位操作题目列表

2)补码运算 表2列出了bits.c中一组使用整数的补码表示的函数。可参考bits.c中注释说明和tests.c中对应的测试函数了解其更多具体信息。 表2 补码运算题目列表 3)浮点数操作 表3列出了bits.c中一组浮点数二进制表示的操作函数。可参考bits.c中注释说明和tests.c中对应的测试函数了解其更多具体信息。注意float_abs的输入参数和返回结果(以及float_f2i函数的输入参数)均为unsigned int类型,但应作为单精度浮点数解释其32 bit二进制表示对应的值。 表3 浮点数操作题目列表

汇编语言学习知识程序设计实验

目录 目录 (1) 实验一利用DEBUG熟悉常用指令的使用 (2) 一、实验目的 (2) 二、示例 (2) 三、实验题 (2) 实验二汇编程序和连接程序的使用 (6) 一、实验目的。 (6) 二、示例。 (6) 三、实验题。 (8) 实验三顺序结构程序设计 (11) 一、实验目的 (11) 二、示例 (11) 三、实验题 (12) 四、实验报告 (15) 实验四循环结构程序设计 (16) 一、实验目的 (16) 二、示例 (16) 三、实验题 (18) 实验五分支结构程序设计 (21) 一、实验目的 (21) 二、示例 (21) 三、实验题 (22) 实验六子程序设计 (29) 一、实验目的 (29) 二、实验题 (29)

实验一利用DEBUG熟悉常用指令的使用 一、实验目的 熟悉指令系统,掌握常用指令的用法;通过实验加深对各种寻址方式的理解;能熟练使用DEBUG中的命令对指令进行反汇编,观察并了解机器代码。 二、示例 请分别用一条汇编语言指令完成如下功能:(过程略)。 1.用寄存器BX和SI的基址变址寻址方式把存储器的一个字节与AL寄存器的内容相加,并把结果送到AL中。 ADD AL,[BX][SI] 2.用位移量为0520H的直接寻址方式把存储器中的一个字与3412H相加,并把结果送回该存储单元。 ADD WORF PTR [0520H],3412H 三、实验题 1.调试、验证下列指令的结果,已知(DS)=2000H,(BX)=0100H,(SI)=0002H,(BP)=0200H,(SS)=2300H,(20100)=12H,(20101)=34H,(20102)=56H,(20103)=78H,(21200)=2AH,(21201)=4CH,(21202)=B7H,(21203)=65H,(23204)=88H,说明各指令执行完后AX寄存器的内容。要求输入指令,相应存储单元的内容要事先设置,单步 P执行,观察执行结果。 (设置存储器的值)

汇编语言程序设计课后习题解答宋人杰2版

第1章汇编语言基础知识 1.简述汇编语言源程序、汇编程序、和目标程序的关系。 答:用汇编语言编写的程序称为汇编源程序;汇编源程序在汇编程序的翻译下转换成计算机语言变成目标程序。 2. 简述汇编语言的优缺点。 答:(1) 汇编语言的优点: ①可有效地访问、控制计算机各种硬件设备,如磁盘、存储器、CPU、I/O端口等。. ②目标代码简短,占用内存少,执行速度快,是高效的程序设计语言。 ③可与高级语言配合使用,应用十分广泛。 (2) 汇编语言的缺点: ①通用性和可移植性较差 ②相对于高级语言来说较繁锁、易出错、不够直观。 3.CPU的寻址能力为8KB,那么它的地址总线的宽度为多少? 答:13 4. 1KB的存储器有多少个存储单元? 答:1024个字节。 5. 指令中的逻辑地址由哪两部分组成? 答:指令中的逻辑地址由段基址和偏移量组成。 6. 以下为用段基址:偏移量形式表示的内存地址,试计算它们的物理地址。 (1) 12F8:0100 (2) 1A2F:0103 (3) 1A3F:0003 (4) 1A3F:A1FF 答: (1) 13080H (2) 1A3F3H (3) 1A3F3H (4) 245EFH 7. 自12FA:0000开始的内存单元中存放以下数据(用十六进制形式表示): 03 06 11 A3 13 01,试分别写出12FA:0002的字节型数据、字型数据及双字型数据 的值。 答:字节型数据:11H 字型数据:0A311H 双字型数据:0113A311H 8. 内存中某单元的物理地址是19318H,段基地址为1916H,则段内偏移地址为 多少?若段内偏移地址为2228H,则段基地址为多少? 答:若段基地址为1916H,则段内偏移地址为01B8H;若段内偏移地址为2228H,则段基地址为170FH 9. 在实模式环境中,一个段最长不能超过多少字节? 答:64KB 10. 实模式可寻址的内存范围是多少? 答:1MB

华中科技大学80X86汇编语言程序设计试卷Word版

《汇编语言程序设计》网络学院模拟试卷一2004.4班级________________ 姓名______________ 学号______________ 成绩______ 一、改错题(10分,每题1分,在错误处划线,线下写上正确答案) 1. SHR BH, 8 2. ADD [BX], –15 3. LEA POINT, BUF 4. IN DX, 200 5. PUSH DH 6. MUL 25 7. XLAT BX, TAB 8. REPNZ MOVSW 9. MOV AX, 2[SI][DI] 10. MOV [BX], [SI] 二、单选题(20分,每题1分) 1.MOV指令的特点是________。 A.影响DF B.影响SF C.影响CF D.不影响标志位2.使用寄存器间接寻址方式访问堆栈中某变量时,要选用________寄存器。 A.BX B.BP C.SI D.SP 3.8086标志寄存器中的三个控制标志是________。 A. IF、PF、SF B.DF、OF、CF C.DF、IF、TF D.TF、AF、IF 4.若有符号数运算的结果溢出,则置________为1。 A.OF B.CF C.SF D.IF 5.若某存贮器操作数的偏移地址在SI中,访问该操作数应采用________寻址方式。 A.立即B.寄存器C.寄存器问址D.直接 6.串操作指令中,目的串的逻辑地址应为________。 A.DS:[SI] B.DS:[DI] C.ES:[DI] D.ES:[SI] 7.不在本模块定义而在本模块中引用的符号称________符号。 A.公共B.局部C.自定义D.外部 8.若(CL)= 4,(AX)=0FF0FH,执行语句“ROR AX, CL”后,(AX)=________。 A.0FFFFH B.0FFF0H C.0F0FFH D.0FFFH 9.已知AL中存放着一个压缩BCD码,为实现AL减1操作,应选用________指令序列。 A.DEC AL B.SBB AL,0 C.SUB AL,1 D.SUB AL,1 AAS DAS AAS DAS 10.要将BL中的8位数据送到1234H端口号的外部设备中去,应选用________指令序列。 A.OUT 1234H, BL B.MOV DX,1234H OUT DX, BL C.MOV AL, BL D.MOV DX,1234H MOV DX,1234H MOV AL, BL OUT DX,AL OUT AL, DX 11.已知AX,BX中均为有符号 ...数据,当进行字.除法时,应采用________指令序列。 A.XOR DX,DX B.CBW C.IDIV BX D.CWD

汇编语言程序设计实验报告

微机原理实验报告 实验名称汇编语言程序设计 一、实验目的 1、掌握Lab6000p实验教学系统基本操作; 2、掌握8088/8086汇编语言的基本语法结构; 3、熟悉8088/8086汇编语言程序设计基本方法 二、实验设备 装有emu8086软件的PC机 三、实验内容 1、有一个10字节的数组,其值分别是80H,03H,5AH,FFH, 97H,64H,BBH,7FH,0FH,D8H。编程并显示结果:如果数组是无符号数,求出最大值,并显示; 如果数组是有符号数,求出最大值,并显示。 2、将二进制数500H转换成二-十进制(BCD)码,并显示“500H 的BCD是:” 3、将二-十进制码(BCD)7693转换成ASCII码,并显示“BCD 码7693的ASCII是:” 4、两个长度均为100的内存块,先将内存块1全部写上88H,再 将内存块1的内容移至内存块2。在移动的过程中,显示移动次数1,2 ,3…0AH…64H(16进制-ASCII码并显示子程序) 5、键盘输入一个小写字母(a~z),转换成大写字母 显示:请输入一个小写字母(a~z): 转换后的大写字母是: 6、实现4字节无符号数加法程序,并显示结果,如99223344H + 第1页

99223344H = xxxxxxxxH 四、实验代码及结果 实验代码见代码附录 1.1程序运行结果 图1 无符号最大值结果截图 1.1 程序运行结果

图2 有符号最大值截图2.0 程序运行结果

图3 BCD码显示3.0 程序运行结果

图4 ASCII码显示4.0 程序运行结果

图5 移动次数显示5.0 程序运行结果

华中科技大学汇编实验报告2

课程实验报告 课程名称:汇编语言程序设计实验 实验名称:实验二分支程序、循环程序的设计 实验时间:2016-3-29,14:00-17:30 实验地点:南一楼804室63号实验台 指导教师:张勇专业班级:计算机科学与技术201409班 学号:U201414813姓名:唐礼威 同组学生:无报告日期:2016年3月30日 原创性声明 本人郑重声明:本报告的内容由本人独立完成,有关观点、方法、数据和文献等的引用已经在文中指出。除文中已经注明引用的内容外,本报告不包含任何其他个人或集体已经公开发表的作品或成果,不存在剽窃、抄袭行为。 特此声明! 学生签名: 日期: 成绩评定 指导教师签字: 日期:

目录 1实验目的与要求 (1) 2实验内容 (1) 3实验过程 (2) 3.1任务1 (2) 3.1.1设计思想及存储单元分配 (2) 3.1.2流程图 (3) 3.1.3源程序 (3) 3.1.4实验步骤 (6) 3.1.5实验记录 (7) 4体会 (8) 参考文献 (9)

1实验目的与要求 1、熟悉分支、循环程序的结构及控制方法,掌握分支、循环程序的调试方法; 2、加深对转移指令及一些常用的汇编指令的理解; 3、加深对常用DOS功能调用指令的理解,进一步熟悉TD的使用。 2实验内容 设计实现一个学生成绩查询的程序。 1、实验背景 在以BUF为首址的字节数据存储区中,存放着n个学生的课程成绩表(百分制),每个学生的相关信息包括:姓名(占10个字节,结束符为数值0),语文成绩(1个字节),数学成绩(1个字节),英语成绩(1个字节),平均成绩(1个字节)。 例如: N EQU 1000 BUF DB ‘zhangsan’,0,0 ;学生姓名,不足10个字节的部分用0填充 DB 100, 85, 80,? ; 平均成绩还未计算 DB ‘lisi’,6 DUP(0) DB 80, 100, 70,? DB N-3 DUP( ‘TempValue’,0,80,90,95,?) ;除了3个已经具体定义了学生信息的 成绩表以外,其他学生的信息暂时假 定为一样的。 DB ‘wangwu’,0,0,0,0 DB 85, 85, 100, ? 2、功能一:提示并输入学生姓名 (1)使用9号DOS系统功能调用,提示用户输入学生姓名。 (2)使用10号DOS系统功能调用,输入学生姓名。输入的姓名字符串放在以in_name为首址的存储区中。 (3)若只是输入了回车,则回到“(1)”处重新提示与输入;若仅仅输入字符q,则程序退出,否则,准备进入下一步处理。 3、功能二:以学生姓名查询有无该学生 (1)使用循环程序结构,在成绩表中查找该学生。

8086汇编语言程序设计

实验1 简单汇编语言程序设计 一、实验目的与要求 1.熟悉汇编语言运行、调试环境及方法。 2.掌握简单汇编语言程序的设计方法。 3.熟悉调试工具DEBUG,并运用DEBUG 工具调试程序。 二、实验内容 根据下列要求,编写汇编源程序,汇编连接汇编源程序,并利用DEBUG 工具调试程序,验证程序的正确性。 1. 若X、Y、R、W 是存放8 位带符号数字节单元的地址,Z 是16 位字单元的 地址。试编写汇编程序,完成Z←((W-X) ÷5-Y)?(R+ 2) 。 2.试编写一个程序,测试某数是否是奇数。如该数是奇数,则把DL 的第0 位置1,否则将该位置0。 三、实验报告要求 1.程序算法流程图。 2.源程序清单。 3.程序运行结果。 4.调试过程中遇到的问题和解决的方法。

实验2 分支及循环程序设计 一、实验目的与要求 1.熟悉汇编语言运行、调试环境及方法。 2.掌握分支程序和循环程序的设计方法。 3.熟悉调试工具DEBUG,并运用DEBUG工具调试程序。 二、实验内容 根据下列要求,编写汇编源程序,汇编连接汇编源程序,并利用DEBUG工具调试程序,验证程序的正确性。 1.编写汇编程序,统计某存储区若干个数据中英文字母的个数,并将结果在屏幕上显示。 2.从键盘任意输入一组字符数据,请编写汇编程序将该组数据加密后在屏幕上显示。参考加密方法是:每个数乘以2。(说明:本题的加密方法,同学们可以自己拟定) 三、实验报告要求 1.程序算法流程图。 2.源程序清单。 3.程序运行结果。 4.调试过程中遇到的问题和解决的方法。

实验3 子程序程序设计 一、实验目的与要求 1.熟悉汇编语言运行、调试环境及方法。 2.掌握子程序的设计方法。 3.熟悉调试工具DEBUG,并运用DEBUG工具调试程序。 二、实验内容 根据下列要求,编写汇编源程序,并利用DEBUG工具调试程序,验证程序的正确性。 1.编程以十进制形式和十六进制形式显示AX的内容,并把两个显示功能分别封装成子程序dispDEC和dispHEX。 2.设在以EXAMSCORE为首地址的数据缓冲区依次存放某班10名同学5门功课的成绩,现要统计各位同学的总分,并将总分放在该学生单科成绩后的单元,并调用第1个程序封装好的子程序,以十进制方式显示统计情况,显示格式自行设计。请编程完成此功能。数据缓冲区参考数据定义如下: EXAMSCORE DB 01 ;学号 DB 89,76,54,77,99 ;单科成绩 DW ? ;该学生的总分 DB 02 ;学号 DB 79,88,64,97,92 ;单科成绩 DW ? ;该学生的总分 三、实验报告要求 1.程序算法流程图。 2.源程序清单。 3.程序运行结果。 4.调试过程中遇到的问题和解决的方法。

汇编语言程序设计实验篇emu

1.汇编语言程序设计实验篇 1.1.汇编系统软件简介 Emu8086-Microprocessor Emulator是集源代码编辑器、汇编/反汇编工具以及debug 的模拟器。它能模拟一台"虚拟"的电脑运行程序,拥有独立的“硬件”,避免访问真实硬件。该软件兼容Intel的下一代处理器,包括PentiumII、Pentium4。利用该软件提供的调试工具,能够单步跟踪程序,观察程序执行过程中寄存器、标志位、堆栈和内存单元的内容。 1.1.1创建程序 https://www.wendangku.net/doc/9b13874729.html, TEMPLATE程序 本章与指令相关的实验都是用COM TEMPLATE类型的程序完成的。打开emu8086,在“welcome…”对话框中,单击按钮,创建文件。 在“choose code template”对话框中,选择“COM template-simple and tiny executable file format, pure machine code.”后,单击按钮。

在如所示的编辑界面中,在“;add your code here”部分输入相应的指令,第一条指令默认的偏移地址为100h。 输入全部指令后,单击按钮,保存相应的程序段。 2.EXE TEMPLATE程序 本章与DOS功能调用和汇编源程序相关的实验都是用EXE TEMPLATE程序完成的。打开emu8086,在“welcome…”对话框中,单击按钮,创建文件。

在“choose code template”对话框中,选择“EXE template-advanced executable file.header: relocation, checksum.”后,单击按钮。 在如图所示的编辑界面中,已经可以给出了源程序的框架,包含数据段、堆栈段和代码段的定义以及必要的功能调用等,在“add your data here”和“;add your code here”部分可以分别输入相应的变量定义和指令。

第四章MCS-51汇编语言程序设计

第四章MCS-51汇编语言程序设计 重点及难点: 单片机汇编语言程序设计的基本概念、伪指令、单片机汇编语言程序的三种基本结构形式、常用汇编语言程序设计。 教学基本要求: 1、掌握汇编语言程序设计的基本概念; 2、掌握伪指令的格式、功能和使用方法; 3、掌握顺序结构、分支结构和循环结构程序设计的步骤和方法; 4、掌握常用汇编语言程序设计步骤和方法。 教学内容 §4.1汇编语言程序设计概述 一、汇编语言的特点 (1)助记符指令和机器指令一一对应,所以用汇编语言编写的程序效率高,占用存储空间小,运行速度快,因此汇编语言能编写出最优化的程序。 (2)使用汇编语言编程比使用高级语言困难,因为汇编语言是面向计算机的,汇编语言的程序设计人员必须对计算机硬件有相当深入的了解。 (3)汇编语言能直接访问存储器及接口电路,也能处理中断,因此汇编语言程序能够直接管理和控制硬件设备。 (4)汇编语言缺乏通用性,程序不易移植,各种计算机都有自己的汇编语言,不同计算机的汇编语言之间不能通用;但是掌握了一种计算机系统的汇编语言后,学习其他的汇编语言就不太困难了。 二、汇编语言的语句格式 [<标号>]:<操作码> [<操作数>];[<注释>] 三、汇编语言程序设计的步骤与特点 (1)建立数学模型 (2)确定算法 (3)制定程序流程图 (4)确定数据结构 (5)写出源程序 (6)上机调试程序 §4.2伪指令 伪指令是程序员发给汇编程序的命令,也称为汇编命令或汇编程序控制指令。 MCS- 51常见汇编语言程序中常用的伪指令:

第四章MCS-51汇编语言程序设计91 1.ORG (ORiGin)汇编起始地址命令 [<标号:>] ORG <地址> 2.END (END of assembly)汇编终止命令 [<标号:>] END [<表达式>] 3.EQU (EQUate)赋值命令 <字符名称> EQU <赋值项> 4.DB (Define Byte)定义字节命令 [<标号:>] DB <8位数表> 5.DW (Define Word)定义数据字命令 [<标号:>] DW <16位数表> 6.DS (Define Stonage )定义存储区命令 [<标号:>] DW <16位数表> 7.BIT位定义命令 <字符名称> BIT <位地址> 8.DA TA数据地址赋值命令 <字符名称> DATA <表达式> §4.3单片机汇编语言程序的基本结构形式 一、顺序程序 [例4-1]三字节无符号数相加,其中被加数在内部RAM的50H、51H和52H单元中;加数在内部RAM的53H、5414和55H单元中;要求把相加之和存放在50H、51H和52H单元中,进位存放在位寻址区的00H位中。 MOV R0 ,# 52H ;被加数的低字节地址 MOV R1 ,# 55H ;加数的低字节地址 MOV A ,@ R0 ADD A ,@ R1 ;低字节相加 MOV @ R0 , A ;存低字节相加结果 DEC R0 DEC R1 MOV A ,@ R0 ADDC A ,@ R1 ;中间字节带进位相加 MOV @ R0 , A ;存中间字节相加结果 DEC R0 DEC R1 MOV A ,@ R0 ADDC A ,@ R1 ;高字节带进位相加 MOV @ R0 , A ;存高字节相加结果 CLR A

新版汇编语言程序设计钱晓捷第1章习题答案

第1章汇编语言基础知识(全) 2010-10-18 19:32:40| 分类:答案集锦| 标签:|字号大中小订阅 第1章汇编语言基础知识 〔习题1.1〕简述计算机系统的硬件组成及各部分作用。 〔解答〕 CPU:包括运算器、控制器和寄存器组。运算器执行所有的算术和逻辑运算;控制器负责把指指令逐条从存储器中取出,经译码分析后向机器发出各种控制命令,并正确完成程序所要求的功能;寄存器组为 处理单元提供所需要的数据。 存储器:是计算机的记忆部件,它用来存放程序以及程序中所涉及的数据。 外部设备:实现人机交换和机间的通信。 〔习题1.2〕明确下列概念或符号: 主存和辅存,RAM和ROM,存储器地址和I/O端口,KB、MB、GB和TB 〔解答〕 主存又称内存是主存储器的简称,主存储器存放当前正在执行的程序和使用的数据,CPU可以直接存取,它由半导体存储器芯片构成其成本高、容量小、但速度快。辅存是辅助存储器的简称,辅存可用来长期保存大量程序和数据,CPU需要通过I/O接口访问,它由磁盘或光盘构成,其成本低、容量大,但速 度慢。 RAM是随机存取存储器的英语简写,由于CPU可以从RAM读信息,也可以向RAM写入信息,所以RAM也被称为读写存储器,RAM型半导体存储器可以按地址随机读写,但这类存储器在断电后不能保存信息;而ROM中的信息只能被读出,不能被修改,ROM型半导体通常只能被读出,但这类存储器断电 后能保存信息。 存储器由大量存储单元组成。为了区别每个单元,我们将它们编号,于是,每个存储单元就有了一个存储地址,I/O接口是由一组寄存器组成,为了区别它们,各个寄存器进行了编号,形成I/O地址,通常 称做I/O端口。 KB是千字节、MB是兆字节、GB是吉字节和TB是太字节,它们都是表示存储器存储单元的单位。 〔习题1.3〕什么是汇编语言源程序、汇编程序、目标程序? 〔解答〕 用汇编语言书写的程序就称为汇编语言源程序;完成汇编工作的程序就是汇编程序;由汇编程序编 译通过的程序就是目标程序。

华中科技大学汇编语言程序设计试卷

华中科技大学计算机科学与技术二学位 《80X86汇编语言程序设计》试卷样例 考试时间:2011年7月2日(第19周周六)下午14:30-17:00 考试地点:西十二教学楼(S402-0904,S403-0905,S404-0906)班级学号姓名 一、单项选择填空:(共10 分,每小题1 分) (1) 指令“MOV AX, ES:[BP]”中的源操作数在当前_________中。(B) A. 数据段 B. 附加数据段 C. 堆栈段 D. 代码段 (2) 将AL中的无符号数压入堆栈,下面的方法不正确的是_________。(A) (A) CBW PUSH AX (B) MOV AH,0 PUSH AX (C) MOVZX AX, AL PUSH AX (D) XOR AH, AH PUSH AX (3) 只有寄存器_________能作基址和变址寄存器。(C) (A) AX、BX、CX、DX (B) SI、DI、BP、SP (C) BX、SI、DI、BP (D) AX、CX、SI、DI (4) 两负数相加,结果为正,则标志位_________均为1.(D) (A) ZF、SF、CF、DF (B) ZF、CF、DF (C) SF、CF、OF

(D) CF、OF (5) 指令"ADD [BX], 2"的错误原因为________.(B) (A) 源操作数和目的操作数不能同时为存贮器操作数. (B) 两个操作数类型模糊 (C) 源操作数不能为立即方式 (D) BX不能用于寄存器间接方式 (6) 已知源操作数在堆栈段,语句“MOV AX,[BP+BX]存在语法错误,现改正为以下四种形式,但只有________是正确的。(C) (A) MOV AX,SS:[BP+BX] (B) MOV WORD PTR [DI],[BP] (C) MOV AX,SS:[BX+SI] (当基址寄存器BR=BX时,系统默认操作数在DS中) (D) MOV AX,[BX+DI] (当基址寄存器BR=BP时,系统默认操作数在SS中) (7) 设V AR 为字变量, A为符号常量,下面四个语句中有一个错误的,这个错误语句是________.(C) (A) MOV V AR , A (B) MOV AX , V AR (C) MOV A , AX (D) MOV AX, A (8) 在使用除法指令作字除法时,被除数应放在寄存器________中。(C) (A) BX和AX (B) CX和AX (C) DX和AX (D) AX (9) 在下列数据段中,(A+2)和TT的值各为________。(B) DATA SEGMENT A DW 10,20,30 TT =$-A B DB 2 DUP(0) DATA ENDS (A) 30,6 (B) 20,6 (C) 30,3 (D) 20,3 (10) 已知(AX)=a,(BX)=b,a、b均为无符号数,请选择合适的转移指令,使得(AX)>(BX) 时转L处执行。(A) CMP AX,BX _______ L (A) JA (B) JB (C) JG (D) JL

实验一基础汇编语言程序设计

实验一基础汇编语言程序设计 实验目的 1.学习和了解TEC-XP十六位机监控命令的用法; 2.学习和了解TEC-XP十六位机的指令系统; 3.学习简单的TEC-XP十六位机汇编程序设计。 实验内容 1.使用监控程序的R命令显示/修改寄存器内容、D命令显示存储器内容、E命令修改存储器内容; 2.使用A命令写一小段汇编程序,U命令反汇编刚输入的程序,用G命令连续运行该程序,用T、P命令单步运行并观察程序单步执行情况。 3.学习联机使用TEC-XP教学试验系统和仿真终端软件。 实验要求 在使用该教学机之前,应先熟悉教学机的各个组成部分及其使用方法。 实验步骤 1.关闭电源,将大板上的COMl口与PC机的串口相连; 2.接通电源,在PC机上运行PCEC.EXE文件,设置所用PC机的串口为“l”或“2”,其它的设置一般不用改动,直接回车即可; 3.置控制开关为001110(连续、内存读指令、组合逻辑、16位、联机),开关拨向上方表示“1”,拨向下方表示“0”,“X”表示任意。其它实验相同; 4.按一下“RESET”按键,再按一下“START”’按键,主机上显示: 5.用R命令查看寄存器内容或修改寄存器的内容 1.用R命令查看寄存器或修改寄存器内容 1)在命令行提示符状态下输入: R↙;显示寄存器的内容 注:寄存器的内容在运行程序或执行命令后会发生变化。

2)在命令行提示符状态下输入: R R0↙;修改寄存器R0的内容,被修改的寄存器与所赋值之间可以无空格, 也可有—个或数个空格 主机显示: 寄存器原值:xxxx 在后面输入新的值0036 再用R命令显示寄存器内容,则R0的内容变为0036。 2.用D命令显示存储器内容 在命令行提示符状态下输入: D 2000↙ 会显示从2000H地址开始的连续128个字的内容; 连续使用不带参数的D命令,起始地址会自动加128(即80H)。

华中科技大学汇编实验报告6

华中科技大学汇编实验报告6

课程实验报告 课程名称:汇编语言程序设计实验 实验名称:实验六输入输出与中断处理程序设计 实验时间: 2016-4-26,14:00-17:30 实验地点:南一楼804室74号实验台 指导教师:张勇专业班级:计算机科学与技术201409班学号:U201414813 姓名:唐礼威 同组学生:无报告日期:2016年 5 月2日 原创性声明 本人郑重声明:本报告的内容由本人独立完成,有关观点、方法、数据和文献等的引用已经在文中指出。除文中已经注明引用的内容外,本报告不包含任何其他个人或集体已经公开发表的作品或成果,不存在剽窃、抄袭行为。 特此声明! 学生签名: 日期: 成绩评定

指导教师签字: 日期:

目录 1实验目的与要求 (3) 2实验内容 (3) 3实验过程 (4) 3.1任务1 (4) 3.1.1设计思想及存储单元分配 (4) 3.1.2流程图 (4) 3.1.3源程序 (4) 3.1.4实验步骤 (6) 3.1.5实验记录 (7) 3.2任务2 (7) 3.2.1设计思想及存储单元分配 (7) 3.2.2流程图 (9) 3.2.3源程序 (9) 3.2.4实验步骤 (12) 3.2.5实验记录 (12) 3.3任务3 (14) 3.3.1设计思想及存储单元分配 (14) 3.3.2流程图 (14) 3.3.3源程序 (14) 3.3.4实验步骤 (17) 3.3.5实验记录 (17) 4体会 (18) 参考文献 (19)

1实验目的与要求 (1) 掌握中断矢量表的概念; (2)熟悉I/O访问,BIOS功能调用方法; (3) 掌握实方式下中断处理程序的编制与调试方法。 2实验内容 任务1:用三种方式获取中断类型码10H对应的中断处理程序的入口地址。 要求:首先要进入虚拟机状态,然后 (1)直接运行调试工具(TD.EXE),观察中断矢量表中的信息。 (2)编写程序,用DOS系统功能调用方式获取,观察功能调用相应的出口参数与“(1)”看到的结果是否相同(使用TD观看出口参数即可)。 (3)编写程序,直接读取相应内存单元,观察读到的数据与“(1)”看到的结果是否相同(使用TD观看程序的执行结果即可)。 任务2:编写一个接管键盘中断的中断服务程序并驻留内存,要求在程序返回DOS 操作系统后,键盘的按键A变成了按键B,而B变成了A。 要求: (1)在DOS虚拟机或DOS窗口下执行程序,中断服务程序驻留内存。 (2)在DOS命令行下按键A,屏幕显示为B,按B时屏幕显示为A。执行TD,在代码区输入指令“MOV AX,0”看是否能发生变化。 (3)选作:另外编写一个中断服务程序的卸载程序,将键盘中断服务程序恢复到原来的状态(也就是还原中断矢量表的信息)。 任务3:读取CMOS内指定单元的信息,按照16进制形式显示在屏幕上。 要求:

【精品】汇编语言程序设计习题答案

钱晓捷新版汇编语言程序设计习题答案 第一章汇编语言基础知识 1.1、简述计算机系统的硬件组成及各部分作用 1。2、明确下列概念或符号: 主存和辅存,RAM和ROM,存储器地址和I/O端口,KB、MB、GB和TB 1.3、什么是汇编语言源程序、汇编程序、目标程序? 1。4、汇编语言与高级语言相比有什么优缺点? 1.5、将下列十六进制数转换为二进制和十进制表示 (1)FFH (2)0H (3)5EH (4)EFH (5)2EH (6)10H (7)1FH (8)ABH 1。6、将下列十进制数转换为BCD码表示 (1)12 (2)24 (3)68 (4)127 (5)128 (6)255 (7)1234 (8)2458 1.7、将下列BCD码转换为十进制数 (1)10010001 (2)10001001 (3)00110110 (4)10010000

(5)00001000 (6)10010111 (7)10000001 (8)00000010 1.8、将下列十进制数分别用8位二进制数的原码、反码和补码表示 (1)0 (2)—127 (3)127 (4)—57 (5)126 (6)-126 (7)—128 (8)68 1。9、完成下列二进制数的运算 (1)1011+1001 (2)1011-1001(3)1011×1001(4)10111000÷1001 (5)1011 ∧~1011 (8)1011 ⊕10011001(6)1011 ∨1001(7) 1。10 数码0~9、大写字母A~Z、小写字母a~z对应的ASCII码分别是多少?ASCII 码为0dh、0ah对应的是什么字符? 1。11、计算机中有一个“01100001”编码,如果把它认为是无符号数,它是10进制什么数?如果认为它是BCD码,则表示什么数?又如果它是某个ASCII码,则代表哪个字符? 1。12、简述Intel80x86系列微处理器在指令集方面的发展。 1.13、什么是DOS和ROM—BIOS? 1。14、简述PC机最低1MB主存空间的使用情况。 1.15、罗列8086CPU的8个8位和16位通用寄存器,并说明各自的作用。

汇编语言程序设计实验内容(川大微机原理实验资料和内容以及MASM使用方法)

第一部分汇编语言程序设计 实验一熟悉、使用DEBUG调试工具 一.上机目的: 1.了解并逐步熟悉汇编语言的编辑方法及特点. 2.复习8088汇编语言的段结构、常用的指令与伪指令、存储空间的分配等。 3.掌握汇编语言的编辑、汇编及连接的过程。 4.了解并逐步掌握运用DEBUG进行调试汇编语言程序。 二.实验内容: 1.运用8086汇编语言,编辑多字节非压缩型BCD数除法的简单程序,文件名取为*.ASM。 2.运用MASM﹒EXE文件进行汇编,修改发现的各种语法错误,直至正确,形成*.OBJ 文件。 3.运用LINK.EXE文件进行连接,形成*.EXE文件。 4.仔细阅读附录中的DEBUG部分,掌握各种命令的所有方法。 5.运用DEBUG。EXE文件进行调试,使用单步执行命令—T两次,观察寄存器中内容的变化,使用察看存储器数据段命令—D,观察存储器数据段内数值。 6.再使用连续执行命令—G,执行程序,检查结果是否正确,若不正确可使用DEBUG 的设置断点,单步执行等功能发现错误所在并加以改正。 程序清单: 多字节非压缩型BCD数除法(88754/6=14792) DA TA SEGMENT A D B 8,8,7,5,4 B DB 6 C DB 5DUP (0) N EQU 5 DA TA ENDS CODE SEGMENT ASSUME CS:CODE;DS:DATA;ES:DATA, START MOV AX,DA TA MOV DS,AX MOV ES,AX CLD LEA SI,A LEB DI,C MOV CX,N MOV AH,0 LP1:LODSB AAD DIV B STOSB LOOP LP1 MOV CX,N LEA DI,C

汇编语言程序设计复习.doc

知识点 第一章基础知识 (1)正负数的补码表示, 掌握计算机中数和字符的表示; eg.假设机器字长为8位,[+3]补=00000011B,[-3]补= 11111101 H 。 十六进制数0FFF8H表示的十进制正数为65528D,表示的十进制负数为-8D。 8位二进制数被看成是带符号补码整数时,其最小值是-128,最大值是 127 。 第二章80x86计算机组织 (1)中央处理机CPU的组成和80x86寄存器组,重点:专用寄存器,段寄存器 eg: IP寄存器中保存的是?代码段中的偏移地址FLAGS标志寄存器中共有几位条件状态位6位,有几位控制状态位2位,标志寄存器分为哪2类?陷阱标志,中断标志。 (2)存储单元的地址和内容每一个字节单元给以一个唯一的存储器地址,称为物理地址;一个存储单元中存放的信息称为该存储单元的内容。存储器地址的分段,(低位字节存放)低地址,(高位字节存放)高地址;实模式下逻辑地址、选择器和偏移地址;物理地址的表示段基地址加上偏移地址。 eg.如果SS=6000H,说明堆栈段起始物理地址是_____60000H___。 已知字节(00018H)=14H,字节(00017H)=20H,则字(00017H)为__1420H______。 如果(SI)=0088H,(DS)=5570H,对于物理地址为55788H的内存字单元,其内容为0235H,对于物理地址为5578AH的内存字单元,其内容为0E60H,那么执行指令LDS SI,[SI]以后,(SI)= 0235H ,(DS)= 0E60H . 第三章80x86的指令系统和寻址方式 与数据有关的寻址方式(立即寻址方式,寄存器寻址方式,直接寻址方式,寄存器间接寻址方式,寄存器相对寻址方式,基址变址寻址方式,相对基址变址寻址方式)和与转移地址有关的寻址方式(段内直接寻址,段内间接寻址,段间直接寻址,段间间接寻址)。数据传送指令(通用数据传送指令、累加器专用传送指令、输入输出指令)、算术指令(加法指令、减法指令(*加减指令对4个标志位的影响[of,cf,sf,zf])、乘法指令(*乘法指令的要求:目的操作数必须是累加器)、除法指令(*被除数在累加器中,除法指令执行完以后,商和余数在?))、逻辑指令(逻辑运算指令(*XOR,AND,OR,TEST指令及指令执行后对标志位的影响)、移位指令)、串处理指令(与REP相配合工作的MOVS、STOS、LODS 指令,与REPE/REPZ和REPNE/REPNZ联合工作的CMPS、SCAS指令)、控制转移指令(无条件转移指令、条件转移指令、循环指令、子程序调用指令、中断)。eg.【习题3.8】假定(DS)=2000H,(ES)=2100H,(SS)=1500H,(SI)=00A0H,

相关文档
相关文档 最新文档