合肥工业大学汇编语言程序设计实验报告.docx

上传人:b****8 文档编号:23816005 上传时间:2023-05-21 格式:DOCX 页数:28 大小:2.19MB
下载 相关 举报
合肥工业大学汇编语言程序设计实验报告.docx_第1页
第1页 / 共28页
合肥工业大学汇编语言程序设计实验报告.docx_第2页
第2页 / 共28页
合肥工业大学汇编语言程序设计实验报告.docx_第3页
第3页 / 共28页
合肥工业大学汇编语言程序设计实验报告.docx_第4页
第4页 / 共28页
合肥工业大学汇编语言程序设计实验报告.docx_第5页
第5页 / 共28页
点击查看更多>>
下载资源
资源描述

合肥工业大学汇编语言程序设计实验报告.docx

《合肥工业大学汇编语言程序设计实验报告.docx》由会员分享,可在线阅读,更多相关《合肥工业大学汇编语言程序设计实验报告.docx(28页珍藏版)》请在冰豆网上搜索。

合肥工业大学汇编语言程序设计实验报告.docx

合肥工业大学汇编语言程序设计实验报告

合肥工业大学

计算机与信息学院

实验报告

课程:

汇编语言程序设计

专业班级:

学号:

姓名:

实验一Debug程序的使用

一.实验目的

1、熟悉DEBUG程序中的命令,学会在DEBUG下调试运行汇编语言源程序。

2、掌握8086/8088的寻址方式及多字节数据的处理方法。

二.实验内容

实验内容:

1、利用DEBUG程序中的“E”命令,将两个多字节数“12345678H”和“FEDCBA98H”分别送入起始地址为DS:

0200H和DS:

0204H两个单元中。

2、分别用直接寻址方式和寄存器间接寻址方式编写程序段,实现将DS:

0200H单元和DS:

0204H单元中的数据相加,并将运算结果存放在DS:

0208H单元中。

实验要求:

本次实验的内容均在DEBUG下完成,实现数据的装入、修改、显示;汇编语言程序段的编辑、汇编和反汇编;程序的运行和结果检查。

三.实验过程和程序

1、启动DOS操作系统

2、运行DEBUG.COM程序(若当前盘为C)

C:

>DEBUG↙

–;(“–”为DEBUG提示符,仅当屏幕出现该提示符后,才可输入DEBUG命令)

3、用“A”命令编辑和汇编源程序

–A↙

186E:

0100MOVAX,[0200]↙

186E:

0103MOVBX,[0202]↙

186E:

0107ADDAX,[0204]↙

186E:

010BADCBX,[0206]↙

186E:

010FMOV[0208],AX↙

186E:

0112MOV[020A],BX↙

186E:

0116↙

4、用“U”命令反汇编验证源程序

–UCS:

0100↙

186E:

0100A10002MOVAX,[0200]

186E:

01038B1E0202MOVBX,[0202]

186E:

010703060402ADDAX,[0204]

186E:

010B131E0602ADCBX,[0206]

186E:

010FA30802MOV[0208],AX

186E:

0112891E0A02MOV[020A],BX

186E:

0116

注意:

1)检查源程序是否有错误,若有则返回到第3步用“A地址”命令进行修改,直到程序无错误。

2)DEBUG约定在其命令或源程序中所涉及到的数据均被看作十六进制数,其后不用“H”说明。

3)在DEBUG下,源程序中不能使用“标号”、“变量”和一些伪指令。

4)在DEBUG下,大小写不敏感。

5、程序未执行前,用“R”命令观察,相关寄存器的内容。

–R↙

如:

(AX)=0000H,(BX)=0000H,(SI)=0000H,

(DI)=0000H,(CS)=13F5H,(IP)=0100H。

6、在程序未执行前,用“D”命令观察DS:

0200H,DS:

0204H、DS:

0208H单元的内容

–D20020B↙

7、用“G”命令运行源程序

–G=1000116↙

8、再用“D”命令观察DS:

0200H~DS:

020BH字节单元中的内容

–D20020B↙

9、用“T”单步操作命令对源程序单步执行,观察AX、BX、CS、IP寄器内容的变化,并与预计的结果相比较。

注意:

D命令显示内存数据,注意观察多字节数据在内存中的存放方式。

指令执行的时。

程序运行结果:

(AX)=1110H,(BX)=1111H

DS:

0208H四字节单元的内容:

11111110H

四.实验结果(包括必要的截图)

五.实验体会

通过这次实验的练习,我熟悉了在DEBUG的环境下,汇编程序中的命令,并且学会调试运行汇编语言源程序,掌握8086/8088的寻址方式及多字节数据的处理方法。

虽然自己动手实现了简单的计算的中间出现了很多错误,但是在查阅书本以及在老师和同学的帮助下完成了实验任务。

实验二汇编语言程序设计(顺序、循环)

一.实验目的

1、掌握顺序和循环程序结构和设计方法;

2、熟悉在PC机上建立、汇编、连接、调试和运行8086/8088汇编语言程序的过程。

二.实验内容

1、X、Y、Z、V均为字变量,在X、Y、Z、V字单元中存放是16位带符号数。

试编写汇编语言程序完成以下功能:

①计算表达式值(V–(X*Y+Z-720))/X;

②将上述表达式运算结果整数放在SUM1单元,余数放在SUM2单元。

2、求一个班50名学生成绩的平均值(附加题:

最大值和最小值,并将结果显示出来)

3、从键盘读入一个字符串,以Enter结束,字符串不超过50个字符,并打印该字符串(附加题:

查找中间是否有‘asm’子串。

如果有,输出‘Yes’;否则,输出‘No’)。

三.实验过程和程序

1)datasegment

xdw1

ydw0

zdw0

vdw0

sum1dw?

sum2dw?

dataends

codesegment

assumecs:

code,ds:

data

start:

movax,data

movds,ax

movax,x

imuly

movcx,ax

movbx,dx

movax,z

cwd

addcx,ax

adcbx,dx

subcx,720

sbbbx,0

movax,v

cwd

subax,cx

sbbdx,bx

idivx

movsum1,ax

movsum2,dx

movax,4c00h

int21h

codeends

endstart

2datasegment

gradedw98,98,96,95,94,93,87,86,85,97,86

dataends

codesegment

assumecs:

code,ds:

data

start:

movax,data

movds,ax

xorax,ax

movcx,11

movbx,offsetgrade

loop1:

addax,[bx]

incbx

incbx

looploop1

movcx,11

idivcx

movbx,ax

movax,4c00h

int21h

Codeends

endstart

3)DATA SEGMENT

BUF DB 50, ?

 50 DUP(24H)

CHAR  DB 0AH,0DH,"$"

DATA ENDS

CODES SEGMENT

    ASSUME CS:

CODES,DS:

DATA

START:

    MOV AX,DATA

    MOV DS,AX

   

    MOV AH,10

    LEA DX,BUF

    INT 21H

    LEA DX,CHAR

    MOV AH,9

    INT 21H

   

    LEA DX,BUF+2

    MOV AH,9

    INT 21H

   

    MOV AH,4CH

    INT 21H

 

四.实验结果(包括必要的截图)

五.实验体会

通过这次实验的练习,我掌握了顺序和循环程序结构和设计方法,并且可以自己动手在debug下运用顺序和循环的程序结构自己设计汇编的代码,另外这节课我还学会了在在屏幕上输入和输出字符串,非常的有趣,顺便我又熟悉了一遍在PC机上建立、汇编、连接、调试和运行8086/8088汇编语言程序的过程,感觉收获颇丰。

挺高了自己对于学习汇编的兴趣。

 

实验三汇编语言子程序设计(分支、子程序)

一.实验目的

1、掌握分支和子程序结构和设计方法;

2、熟悉在PC机上建立、汇编、连接、调试和运行8086/8088汇编语言程序的过程。

3、通过汇编语言了解高级语言的参数传递等知识。

二.实验内容

1、1.BL中的只有一位为1。

编写程序测试,并输出提示信息“TheXBitis1”,要求:

地址表和转移表。

2.编写一个子程序计算z=f(x,y)=x*y+x-y(x,y,z有符号数内存数)。

要求通过堆栈(寄存器、内存)传送所有参数。

3.实践CAsm的转换过程。

三.实验过程和程序

1.

;实验三第一题

DATASEGMENT

;定义提示信息msg,msgi分别代表第i字节出为1

msg1db'the1bitis1',0dh,0ah,'$'

msg2db'the2bitis1',0dh,0ah,'$'

msg3db'the3bitis1',0dh,0ah,'$'

msg4db'the4bitis1',0dh,0ah,'$'

msg5db'the5bitis1',0dh,0ah,'$'

msg6db'the6bitis1',0dh,0ah,'$'

msg7db'the7bitis1',0dh,0ah,'$'

msg8db'the8bitis1',0dh,0ah,'$'

DATAENDS

STACKSSEGMENT

;未定义栈内容

STACKSENDS

CODESSEGMENT

ASSUMECS:

CODES,DS:

DATA,SS:

STACKS

START:

MOVAX,DATA

MOVDS,AX

;程序代码部分

xorbx,bx;用异或将bx,dx部分清零

xordx,dx

movbl,08h;将00001000b赋值给bl

movcx,8;利用loop进行8次循环

Lp1:

shrbl,1;将bl进行逻辑右移一次

jcnext;判断CF中数据是否为1,若是跳转到next处

adddx,3;dx加3

loopLp1

next:

movah,09h

leasi,table;将转移表的地址传入到si中

addsi,dx;得到转移表的CF为1的地方

jmpsi

table:

;同一个代码段内使用near跳转

jmpnearptrl1

jmpnearptrl2

jmpnearptrl3

jmpnearptrl4

jmpnearptrl5

jmpnearptrl6

jmpnearptrl7

jmpnearptrl8

;Li:

将msgi的地址传入到dx中,并跳转到done处

l1:

leadx,msg1

jmpdone

l2:

leadx,msg2

jmpdone

l3:

leadx,msg3

jmpdone

l4:

leadx,msg4

jmpdone

l5:

leadx,msg5

jmpdone

l6:

leadx,msg6

jmpdone

l7:

leadx,msg7

jmpdone

l8:

leadx,msg8

jmpdone

;返回汇编窗口

done:

int21h

MOVAH,4CH

INT21H

;代码部分结束

CODESENDS

ENDSTART

2.DATASSEGMENT

xdw6

ydw8

DATASENDS

STACKSSEGMENT

;未定义栈部分

STACKSENDS

CODESSEGMENT

ASSUMECS:

CODES,DS:

DATAS,SS:

STACKS

START:

MOVAX,DATAS

MOVDS,AX

;主程序部分

movax,x;分别将x,y压栈

pushax

movax,y

pushax

callf;调用子程序f(x,y)

addsp,4

popax

popax;子程序调用结束,弹栈

MOVAH,4CH

INT21H

;子程序部分

fproc

pushbp

movbp,sp

pushax

pushdx

pushbx

movbx,[bp+4];bx=y

movax,[bp+6];ax=x

imulbx;x*y

addax,[bp+6];x*y+x

adcdx,0

subax,[bp+4];x*y+x-y

sbbdx,0

popbx

popdx

popax

ret

fendp

CODESENDS

ENDSTART

四.实验结果(包括必要的截图)

五.实验体会

通过这次实验的练习,我掌握分支和子程序结构和设计方法,特别是地址表和转移表的运用,已经可以熟练的运用转移表和地址表进行分支结构的设计,实验二又让我对子程序参数的调用有了深刻的体会,知道了在运用堆栈进行参数传递时需要注意的要点,另外这次实验又让我再一次熟悉一遍在PC机上建立、汇编、连接、调试和运行8086/8088汇编语言程序的过程。

 

实验四汇编语言高级编程专题

一.实验目的

1、汇编语言宏程序设计;

2、掌握中断服务子程序的编写。

3、汇编语言与高级语言的混编。

二.实验内容

1、编写一个宏,求三个数的最小数,原型为:

MIN3x,y,z,min

2、挂接1CH中断,正计时60秒后退出。

要求屏幕显示0-59的秒数。

3、VC++中编写内联汇编,将字节数组的每个元素高低四位互换。

chardbyte[]={0x34,0x45,0x56,0x67,0xaf};

三.实验过程和程序

1;宏min3

min3macrox,y,z

moval,x

movbl,y

movcl,z

cmpal,bl;比较al,bl

jaej1;bl

jmpj2;否则al

j1:

cmpbl,cl;比较bl,cl

jaej3;cl

jmpj5;否则bl

 

j2:

cmpal,cl;比较al,cl

jaej3;cl

jmpj4;否则al

j3:

movah,02h;mincl

movdl,cl

ordl,30h

int21h

jmpdone

j4:

movah,02h;minal

movdl,al

ordl,30h

int21h

jmpdone

j5:

movah,02h;minbl

movdl,bl

ordl,30h

int21h

jmpdone

done:

movah,4ch

int21h

endm

DATASSEGMENT

;未定义数据段数据

DATASENDS

STACKSSEGMENT

;未定义栈段数据

STACKSENDS

CODESSEGMENT

ASSUMECS:

CODES,DS:

DATAS,SS:

STACKS

START:

MOVAX,DATAS

MOVDS,AX

min32,1,6;找出216三数中最小数

MOVAH,4CH

INT21H

CODESENDS

ENDSTART

2.

DATASEGMENT

OLDISRDW?

?

TIMERDB100

COUNTERDW0

ISDONEDB0

DATAENDS

STACKSSEGMENT

;未定义

STACKSENDS

CODESSEGMENT

ASSUMECS:

CODES,DS:

DATA,SS:

STACKS

START:

MOVAX,DATA

MOVDS,AX

xorax,ax

MOVES,AX

xorcx,cx

MOVAX,ES:

[1ch*4]

MOVOLDISR[0],AX

MOVAX,ES:

[1ch*4+2]

MOVOLDISR[2],AX

MOVWORDPTRES:

[1ch*4],OFFSETISR

MOVWORDPTRES:

[1ch*4+2],SEGISR

WAITHERE:

CMPISDONE,1

JNZWAITHERE

EXIT:

MOVAX,OLDISR[0]

MOVES:

[1ch*4],AX

MOVAX,OLDISR[2]

MOVES:

[1ch*4+2],AX

MOVAX,4C00H

INT21H

ISRPROCFAR

PUSHDX

PUSHAX

MOVAX,DATA

MOVDS,AX

STI

INCTIMER

AGAIN:

movah,0bh

int21h

oral,al

jzj2

MOVAH,8;不显示输入的字符

INT21H

CMPAL,'a'

JNEj2

MOVAH,2h

MOVDL,10

INT21H

MOVCOUNTER,0

j2:

CMPTIMER,1000/55

JBDONE

MOVTIMER,0

MOVAH,2

MOVDL,13

INT21H

j3:

MOVAX,COUNTER

MOVDL,10

DIVDL

MOVDH,AH

MOVDL,AL

MOVAH,2

ADDDL,30H

INT21H

movah,2

movdl,dh

ADDDL,30H

INT21H

incCOUNTER

cmpCOUNTER,60

JNEDONE

MOVISDONE,1

DONE:

PUSHF

CALLDWORDPTROLDISR

CLI

POPAX

POPDX

IRET;中断返回

ISRENDP

CODESENDS

ENDSTART

3.

#include

usingnamespacestd;

intmain(){

chardbyte[]={0x34,0x45,0x56,0x67,0x67};

__asm{

movesi,0

again:

movcl,4

rordbyte[esi],4

incesi

cmpesi,5

jneagain

}

for(inti=0;i<5;i++)

cout<

return0;

}

四.实验结果(包括必要的截图)

五.实验体会

这次实验的练习,使我对汇编语言中宏程序有了一定的了解,并且自己动手编写了宏程序,另外我还掌握了中断服务子程序的编写,感觉非常的复杂,很长时间找不到头绪,最后请教了老师和同学。

在他们的帮助下完成了实验。

虽然花了很久的时间,但是还是非常值得的。

 

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 初中教育 > 其它课程

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1