河北工业大学-汇编实验报告

更新时间:2024-06-04 06:37:01 阅读量: 综合文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

汇编实验

实验一 顺序与分支程序设计

一 、实验目的

1) 掌握顺序程序设计方法。

2) 掌握分支程序的结构及分支程序的设计,调试方法。 2) 学习数据传送及算术和逻辑运算指令的用法。

3) 熟悉在PC机上建立、汇编、连接、调试和运行汇编语言程序的过程。 二、实验内容

1) 有一字变量BUF1是以原码表示的有符号数,要求将其转换为反码和补

码,分别存入BUF2和BUF3单元,并在屏幕上显示出来。

2)有两个两字节无符号数分别放在存储单元A、B起始的缓冲器中,求其和,结果放在A起始的缓冲区并在屏幕上显示。相加若有进位不存入存储单元。

3) 在BUF和BUF+1、BUF+2单元分别放有一个无符号字节型数,编程序将其中最大数存入MAX单元,并在屏幕上显示。

4) 要求同上,只是比较的数为有符号数。

5) 将1000H单元开始的10个字节数,采用奇偶校验,将奇数在前偶数在后仍存回原数据区。本实验要求在DEBUG调试状态下进行,包括汇编程序、运行程序、检查结果。

6) 从键盘上接收一位十进制数X,计算Y值,并以十六进制形式显示出来,Y按下列公式计算。

?X2?X(X?3) ?2?X?2X(X?4)Y??2?X(X?5)2?X/2(X?6)?7) 从键盘上接收两个一位十六进制数X和Y,然后再输入一个A-D之间的一个字符,按下列要求计算。

a)

b) c) d)

三、实验设备

PC机一台

当输入字符为A,则计算X+Y,并以十六进制形式显示出来 当输入字符为B,则计算|X-Y|,并以十六进制形式显示出来 当输入字符为C,则计算X*Y,并以十六进制形式显示出来 当输入字符为D,则计算X/Y,并以十六进制形式显示出来

四、实验准备

1) 分析题目,将程序中的原始数据和最终结果的存取方法确定好。 2) 画出流程图。 3) 写出源程序。

4) 对程序中的结果进行分析,并准备好上机调试与用汇编程序及汇编调试的过程。 五、实验步骤 1) 输入源程序。

2) 汇编、连接程序,生成 .EXE文件,执行文件,检查结果。 六、实验报告的要求

1) 列出源程序,说明程序的基本结构,包括程序中各部分的功能。 2) 说明程序中各部分所用的算法。

3)说明主要符号和所用到寄存器的功能。

4) 总结为什么在设计分支程序时必须解决三个问题:判断、转向和定标号。

5) 说明标志位CF、SF和OF的意义。 6) 上机调试过程中遇到的问题是如何解决的。 7) 对调试源程序的结果进行分析。

Exam1:

DATA SEGMENT ;数据段 BUF1 DW 7898H

BUF2 DW 4 DUP (0), 0AH, 0DH,'$'

BUF3 DW 4 DUP (0), '$'

DATA ENDS ;数据段结束 CODE SEGMENT ;代码段

ASSUME CS:CODE, DS:DATA ;段寄存器关联说明伪指令

BEGIN: MOV AX, DATA

MOV DS, AX ;将数据段的基地址装入数据段寄存器DS MOV AX, BUF1 ;将字型变量BUF1的值装入AX寄存器 ADD AX, 0 ;AX寄存器里的数据加0,以便进行转移测试

JS NEXT ;判断(AX)的正负,若为负则转到NEXT,为正则往下顺序执行。

MOV BUF2, AX ;为正,反码与原码一样 MOV BUF3, AX ;为正,补码与原码一样 JMP EEE

NEXT: AND AX, 7FFFH ;将符号位变为0 NOT AX ;求反码

MOV BUF2, AX ;将BUF1的反码装入BUF2 INC AX ;求补码

MOV BUF3, AX ;将补码装入BUF3 EEE: MOV CX, 0004H ;将0004H装入CX计数器寄存器中 MOV DI, OFFSET BUF2 ;将DI指向变量BUF2开始的存储单元

MOV DX, [DI] ;将DI所指的数据装入DX寄存器中

ADD DI, 03 ;将DI指针下移三个字 BBB: MOV AX, DX ;将DX中的内容装入AX寄存器中 AND AX, 000FH ;即使BUF2的低四位不变,其余均变为0

CMP AL, 0AH ;比较[AL]与0AH的大小,以便能正确转换为0-9的ASCII值

JB QQQ ;若[AL]<0AH,则转到QQQ,否则,顺序执行 ADD AL, 07H ;因为[AL]>0AH,所以[AL] +07H,使得AL能转换成相应数字的ASCII值

QQQ: ADD AL, 30H ;将[AL]转换成相应数字的ASCII值

MOV [DI], AL ;将AL中的内容装入以DS中的内容为段基地址,以DI的内容为偏移地址的存储单元中

DEC DI ;DI=DI-1,即将DI指向前一个存储单元

PUSH CX ;保存CX寄存器的内容 MOV CL, 04H ;给CL寄存器赋值为04H SHR DX, CL ;将[DX]逻辑右移四位 POP CX ;恢复CX寄存器的内容

LOOP BBB ;循环判断语句,CX=CX-1,若CX不等于0,则转到BBB,将下一个低四位存入存储单元中,否则循环结束 MOV CX, 0004H ;给CX寄存器赋值为0004H

MOV SI, OFFSET BUF3 ;将SI指向变量BUF3开始的存储单元 MOV DX, [SI] ;将SI所指的数据装入DX寄存器中 ADD SI, 03H ;将DI指针下移三个字 CCC: MOV AX, DX ;将DX中的内容装入AX寄存器中

AND AX, 000FH ;即使BUF3的低四位不变,其余均变为0 CMP AL, 0AH ;比较[AL]与0AH的大小,以便能正确转换为0-9的ASCII值

JB DDD ;若[AL]<0AH,则转到DDD,否则,顺序执行 ADD AL, 07H ;因为[AL]>0AH,所以[AL] +07H,使得AL能转换成相应数字的ASCII值

DDD:ADD AL, 30H ;将[AL]转换成相应数字的ASCII值 MOV [SI], AL ;将AL中的内容装入以DS中的内容为段基地址,以SI的内容为偏移地址的存储单元中

DEC SI ;SI=SI-1,即将SI指向前一个存储单元 PUSH CX ;保存CX寄存器的内容 MOV CL, 04H ;给CL寄存器赋值为04H SHR DX, CL ;将[DX]逻辑右移四位 POP CX ;恢复CX寄存器的内容

LOOP CCC ;循环判断语句,CX=CX-1,若CX不等于0,则转到CCC,将下一个低四位存入存储单元中,否则循环结束

MOV DX, OFFSET BUF2 ;将BUF2的偏移地址装入DX寄存器中 MOV AH, 09H

INT 21H ;在屏幕上显示BUF1的反码 MOV DX, OFFSET BUF3

MOV AH, 09H

INT 21H ;在屏幕上显示BUF1的补码 MOV AH, 4CH

INT 21H ;带返回码终止 CODE ENDS END BEGIN

Exam2:

DATA SEGMENT ;数据段

A DB 34H, 18H, 2 DUP (0), '$' ;定义字节型变量,其后的每操作数都占有一个字节

B DB 56H, 83H ;定义字节型变量,其后的每操作数都占有一个字节

DATA ENDS ;数据段结束 CODE SEGMENT ;代码段 ASSUME CS: CODE, DS:DATA START: MOV AX, DATA

MOV DS, AX ;将数据段基地址装入数据段寄存器DS MOV AL, A ;将A所指的数装入AL寄存器中 MOV BL, B ;将B所指的数装入BL寄存器中

Exam4:

CODES SEGMENT ASSUME CS:CODES START:

XOR BX,BX MOV DL,2AH MOV CX,9

LOP: PUSH CX INC BL MOV CL,BL MOV DL,2AH LOP2: MOV AH,02H INT 21H LOOP LOP2 POP CX

MOV DL,0AH MOV AH,02H INT 21H

MOV DL,0DH MOV AH,02H INT 21H CMP BL,9 JZ ENDPRO LOOP LOP ENDPRO:

MOV AH,4CH INT 21H CODES ENDS

END START

Exam5:

STACK SEGMENT STACK DB 1024 DUP(0) STACK ENDS DATA SEGMENT

BUF DW 0F101H,110DH,52H,100H,456H COUNT =($-BUF)/2

RESULT DW 4 DUP(?),'$' DATA ENDS

CODE SEGMENT

ASSUME CS:CODE,DS:DATA,SS:STACK WDADD PROC PUSH DI MOV AX, 0 MOV DX, 0

MOV DI, OFFSET BUF NEXT2: ADD AX, [DI] JNC NEXT1 INC DX

NEXT1: ADD DI, 2 LOOP NEXT2

POP DI RET

WDADD ENDP SHOW PROC PUSH CX PUSH DI

MOV CX, 04H

MOV DI, OFFSET RESULT MOV BX, AX ADD DI, 07H

BBB: MOV AX, BX AND AX, 000FH CMP AL, 0AH JB QQQ

ADD AL, 07H

QQQ: ADD AL, 30H MOV [DI], AL DEC DI PUSH CX

MOV CL, 04 SHR BX, CL POP CX LOOP BBB

MOV CX, 0004H CCC: MOV AX, DX AND AX, 000FH CMP AL, 0AH JB DDD

ADD AL, 07H

DDD: ADD AL, 30H MOV [DI], AL DEC DI PUSH CX

MOV CL, 04H SHR DX, CL POP CX LOOP CCC POP DI POP CX RET

SHOW ENDP

BEGIN: MOV AX, DATA MOV DS, AX MOV CX, COUNT

CALL WDADD CALL SHOW

MOV DX, OFFSET RESULT MOV AH, 09H INT 21H

MOV AH, 4CH INT 21H CODE ENDS END BEGIN

实验三 算术运算与代码转换程序设计

一、实验目的

1)掌握算术运算程序的设计方法。 2)掌握代码转换程序的设计方法。 3)进一步掌握各种程序结构。

4)熟练掌握和使用用DEBUG调试程序。 二、实验内容

1)编制两个多字节整数加法和减法程序,并将结果按十六进制形式显示在屏幕上。

2)编制程序实现二进制定点数与十进制数的ASCII码串之间转换,并将结果显示在屏幕上。

3)编写程序计算从键盘输入两个不超过四位的十进制数的和、差、积、商,并以十进制形式输出。

4)写程序把从键盘输入的四位十六进制数转换为压缩的BCD码,并显示输出。

5)编写一通用过程用来将十进制数(从键盘输入)转换为P(从键盘输入)进制数。 三、实验设备 PC机一台 四、实验步骤

1) 按程序流程图编制实验程序。 2) 输入源程序。

3) 汇编、连接程序,执行程序,检查结果。 4) 程序的执行可用DEBUG的G命令,也可用T命令单步跟踪执行。 5) 用D命令检查执行结果。

五、实验报告的要求

1)列出源程序。

2)对程序中用到的寄存器说明其功能。 3)总结算术运算和代码转换程序的设计方法。

4) 说明怎样使用DEBUG进行程序调试的。调试过程中所遇到的问题是如何解决的。

Eaxm1:

DATA SEGMENT A DB 82H,34H,56H,78H,2AH,0BCH,0EFH,00H B DB 34H,56H,78H,9AH,0BCH,0EFH,16H LENB EQU $-B LEN2 EQU (B-A)*2 RES DB LEN2 DUP('?'),'$' DATA ENDS

STACK SEGMENT PARA STACK DW 20 DUP (?) STACK ENDS CODE SEGMENT ASSUME DS:DATA,CS:CODE,SS:STACK START: MOV AX,DATA MOV DS,AX;多字节相加 MOV SI,0 CLC MOV CX,LENB LOP1: MOV AL,A[SI] ADC AL,B[SI] MOV A[SI],AL INC SI LOOP LOP1 ADC BYTE PTR A[SI],0;输出 MOV SI,0 ADD SI,LENB MOV DI,0 MOV CX,LENB+1 LOP2: PUSH CX MOV AL,A[SI];高位转换 MOV BL,AL MOV CL,4 SHR BL,CL CMP BL,0AH JB NEXT1 ADD BL,07H NEXT1: ADD BL,30H MOV RES[DI],BL INC DI;低位转换 MOV BL,AL AND BL,0FH

CMP BL,0AH JB NEXT2 ADD BL,07H NEXT2: ADD BL,30H MOV RES[DI],BL INC DI DEC SI POP CX LOOP LOP2 MOV AH,09H MOV DX,OFFSET RES INT 21H MOV AH,4CH INT 21H CODE ENDS END START

Exam5:

DATA SEGMENT

STRING1 DB 'INPUT YOUR M=','$' STRING2 DB 'INPUT YOUR P=','$' RE DB 8 DUP(30H) DATA ENDS

STACK1 SEGMENT STACK

DW 60H DUP(0) STACK1 ENDS

CODE SEGMENT

ASSUME CS:CODE,DS:DATA,SS:STACK1

START:MOV AX,DATA

MOV DS,AX

MOV DX,OFFSET STRING1 MOV AH,09H INT 21H

MOV AH,01H INT 21H

AND AX,0000FH MOV DL,10 MUL DL MOV BX,AX MOV AH,01H INT 21H

AND AL,0FH CLC

ADD BL,AL ADC BH,0 MOV DL,0AH MOV AH,02H INT 21H

MOV DL,0DH INT 21H

MOV DX,OFFSET STRING2 MOV AH,09H INT 21H

MOV AH,01H INT 21H MOV DH,AL SUB DH,30H MOV DL,0AH MOV AH,02H INT 21H

MOV DL,0DH INT 21H MOV AX,BX MOV BX,0001H

MOV DI,OFFSET RE LOP1:

DIV DH

ADD AH,30H MOV [DI],AH CBW

ADD DI,BX CMP AL,0

JA LOP1

MOV CX,08H

MOV DI,OFFSET RE CLC

ADC DI,CX LOP2:

SUB DI,BX MOV DL,[DI] MOV AH,02H INT 21H LOOP LOP2 MOV AH,4CH INT 21H CODE ENDS END START

实验五 输入输出程序设计

一、实验目的

1) 掌握输入输出程序的编写方法。 2) 熟悉系统功能调用的方法。 3) 熟悉动画程序的编写方法。

二、实验内容

1)在CRT上每隔一秒连续显示字符0-9。 编程提示

为了使输出的字符之间有空格,在每一个循环中输出一个0-9的字符和一个空格。为了输出0-9,置寄存器BL初值为0,每循环一次使其增量。为了保证输出是十进制,增量后用DAA调整指令。由于输出为一位十进制数,用AND 0FH指令屏蔽高4位。

2)用系统功能调用将‘HELLO’由键盘输入,再从屏幕输出‘***HELLO***’。

3)编制在屏幕上画线的子程序,调用该子程序画一矩形。

4)编制字母下落一行的子程序,调用该子程序使字母从屏幕顶部下落到底部。

5)创建一磁盘文件,保存从键盘输入的字符串。

6)编写程序用设置系统时间,首先从键盘以十进制数形式输入时间,然后修改系统时间,并重新以十进制形式显示时间。

7)编写程序将屏幕分割成格状,每一格涂上不同颜色,格数从键盘输入。 8)编写程序在屏幕上显示菜单,输入相应菜单的序号后,选种该菜单项。

三、实验设备 PC机一台 四、实验步骤

1) 按程序流程图编制实验程序。 2) 输入源程序。

3) 汇编、连接程序,执行程序,检查结果。 4) 程序的执行可用DEBUG的G命令,也可用T命令单步跟踪执行。 五、实验报告的要求 1) 列出源程序。

2) 总结输入输出程序及动画的编写方法。 3) 总结常用系统调用的功能及调用方法。

Exam1:

STACK SEGMENT STACK DB 1024 DUP(0) STACK ENDS

CODE SEGMENT

ASSUME CS:CODE,SS:STACK START: MOV BL, 0 LP: MOV DL, 20H

MOV AH, 2 INT 21H

MOV AL, BL ADD AL, 0 DAA

AND AL, 0FH MOV BL, AL PUSH BX

OR AL, 30H MOV DL, AL MOV AH, 2 INT 21H

MOV BX, 3E8H

LP2: MOV CX, 176H ;延时1ms LP1: PUSHF

POPF

LOOP LP1 DEC BX JNZ LP2 POP BX INC BL JMP LP

CODE ENDS

END START

Exam2:

STACK SEGMENT STACK DB 1024 DUP(0) STACK ENDS DATA SEGMENT

BUFF DB 6,7 DUP(?),‘$’ DATA ENDS

INPUT MACRO BUFE

MOV DX, OFFSET BUFE MOV AH, 0AH INT 21H ENDM

PUTCHAR MACRO CHAR

MOV DL, CHAR MOV AH, 02H INT 21H ENDM CODE SEGMENT

ASSUME CS:CODE,DS:DATA,SS:STACK START: MOV AX, DATA

MOV DS, AX

INPUT BUFF ;读取字符串?BUFF PUTCHAR 0DH

PUTCHAR 0AH ;光标另起一行 MOV CX, 0003H NEXT:PUTCHAR 2AH

LOOP NEXT

MOV CL, BUFF+1 SUB CH, CH

MOV BX, OFFSET BUFF+2 BEGIN: MOV AL, [BX]

PUTCHAR AL INC BX LOOP BEGIN MOV CX, 0003H

NEXT1: PUTCHAR 2AH

LOOP NEXT1 MOV AH, 4CH INT 21H

CODE ENDS

END START

Exam5:

SSTACK SEGMENT STACK 'stack' DB 1024 DUP(?) SSTACK ENDS DATA SEGMENT

ASKNAME DB 0DH,0AH,'Enter the' DB 'dest file name:$'

ASKCONT DB 0DH,0AH,'Enter the string' DB 'as file content:'0dh,0ah,'$' FILEBUF DB 62,63 DUP(?) HAND_D DW ?

MSGMER DB 0DH,0AH,0AH

DB 'Directory full',0DH,0AH,'$' MSGWER DB 0DH,0AH,0AH

DB 'Disk full',0DH,0AH,'$' MSGSUC DB 0DH,0AH,0AH

DB 'Write file is Successful' DB 0DH,0AH,'$' DATA ENDS

DISPLY MACRO TEXT MOV DX,OFFSET TEXT MOV AH,09H INT 21H ENDM

CRHAND MACRO PATH,ATTR MOV DX,OFFSET PATH MOV CL,ATTR XOR CH,CH

MOV AH,3CH INT 21H ENDM

WRHAND MACRO HAND,BUFF,BYTE MOV BX,HAND

MOV DX,OFFSET BUFF ADD DX,2 MOV CL,BYTE XOR CH,CH MOV AH,40H INT 21H ENDM

CLHAND MACRO HAND MOV BX,HAND MOV AH,3EH INT 21H ENDM

CODE SEGMENT PROG PROC FAR

ASSUME CS:CODE,DS:DATA,SS:SSTACK PUSH DS MOV AX,0 PUSH AX

MOV AX,DATA

MOV DS,AX DISPLY ASKNAME

MOV DX,OFFSET FILEBUF MOV AH,0AH INT 21H

MOV DI,OFFSET FILEBUF[2] MOV BL,FILEBUF[1] XOR BH,BH

MOV BYTE PTR[BX][DI],00H

CRHAND FILEBUF[2],0 JC CRTERR MOV HAND_D,AX DISPLY ASKCONT

MOV DX,OFFSET FILEBUF MOV AH,0AH INT 21H

WRHAND HAND_D,FILEBUF,FILEBUF[1] JC WRITERR CLHAND HAND_D DISPLY MSGSUC

JMP EXIT

CRTERR: DISPLY MSGMER JMP EXIT

WRITERR:DISPLY MSGWER EXIT: RET PROG ENDP CODE ENDS END PROG

本文来源:https://www.bwwdw.com/article/zu16.html

Top