合肥工业大学汇编实验报告.docx

上传人:b****8 文档编号:9994288 上传时间:2023-02-07 格式:DOCX 页数:32 大小:97.21KB
下载 相关 举报
合肥工业大学汇编实验报告.docx_第1页
第1页 / 共32页
合肥工业大学汇编实验报告.docx_第2页
第2页 / 共32页
合肥工业大学汇编实验报告.docx_第3页
第3页 / 共32页
合肥工业大学汇编实验报告.docx_第4页
第4页 / 共32页
合肥工业大学汇编实验报告.docx_第5页
第5页 / 共32页
点击查看更多>>
下载资源
资源描述

合肥工业大学汇编实验报告.docx

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

合肥工业大学汇编实验报告.docx

合肥工业大学汇编实验报告

合肥工业大学

计算机与信息学院

实验报告

课程:

汇编语言程序设计

专业班级:

计算机科学与技术

学号:

姓名:

实验一Debug程序的使用

一.实验目的

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

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

二.实验内容

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

0200H和DS:

0204H两个单元中。

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

0200H单元和DS:

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

0208H单元中。

要求:

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

三.实验过程和程序

1、启动DOS操作系统

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

C:

>DEBUG↙

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

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

–A↙

186E:

0100MOVAX,[0200]↙

186E:

0103MOVBX,[0202]↙

186E:

0107ADDAX,[0204]↙

186E:

010BADCBX,[0206]↙

186E:

010FMOV[0208],AX↙

186E:

0112MOV[020A],BX↙

186E:

0116↙

5、用“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

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

–R↙

如:

(AX)=,(BX)=,(SI)=,

(DI)=,(CS)=,(IP)=。

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

0200H,DS:

0204H、DS:

0208H单元的内容

–D20020B↙

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

–G=1000116↙

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

0200H~DS:

020BH字节单元中的内容

–D20020B↙

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

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

 

 

验体会

这次的实验让我学会了dos模式下的debug使用,学会了d,r,g,t命令的使用,我觉得尤其是t命令,让我了解了汇编语言,单步执行的使用方法,深刻的理解了汇编语言每一句对寄存器的改变,加深了上课的理解

 

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

一.实验目的

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

Ydw720

Zdw-1

Vdw1

Sum1dw?

Sum2dw?

Dataends

Codesegment

Assumecs:

codeds:

data

Start:

movax,data

Movds,ax

Movax,x;x*y

Movbx,y

Imulbx

Movcx,ax;x*y+z

Movbx,dx

Movax,z

Cwd

Addcx,ax

Adcbx,dx

Subcx,720;x*y+z-720

Sbbbx,0

Movax,v;v-(x*y+z-720)

Cwd

Subax,cx

Sbbdx,bx

Movbx,x;(v-(x*y+z-720))/x

Idivbx

Movsum1,ax;sum1存商,sum2存余数

Movsum2,dx

 

movbx,sum1

movch,4

movcl,4

again:

rolbx,cl

movdl,bl

anddl,0fh

cmpdl,0ah

jlnext

adddl,37h;"A"-"F"

jmpdown

next:

adddl,30h;"0"-"9"

down:

movah,2

int21h

decch

jnzagain

movdl,23h;"#"

movah,2

int21h

movbx,sum2

movch,4

movcl,4

again1:

rolbx,cl

movdl,bl

anddl,0fh

cmpdl,0ah

jlnext1

adddl,37h;"A"-"F"

jmpdown1

next1:

adddl,30h;"0"-"9"

down1:

movah,2

int21h

decch

jnzagain1

Movax,4c00h

Int21h

Codeends

Endstart

2.

datasegment

gradedb61,73,82,90,100,45dup(70)

avg1db?

;平均值的商

avg2db?

;平均值的余数

maxdb?

;最大值

mindb?

;最小值

dataends

codesegment

assumecs:

code,ds:

data

start:

movax,data

movds,ax

movsi,0

movbx,0

movcx,50

movax,0

l1:

moval,grade[si]

cbw

addbx,ax

incsi

loopl1

movax,bx

movbl,50

divbl

movavg1,al

movavg2,ah

movsi,0;找最大值

movcx,50

moval,grade[0]

again0:

cmpal,grade[si]

janext0

moval,grade[si]

next0:

incsi

loopagain0

movmax,al

movsi,0;找最小值

movcx,50

moval,grade[0]

again1:

cmpal,grade[si]

jnanext1

moval,grade[si]

next1:

incsi

loopagain1

movmin,al

movbl,avg1;平均值的商

callsub

movdl,23h;"#"分开不同数据

movah,2

int21h

movbl,avg2;平均值的余数

callsub

movdl,23h;"#"分开不同数据

movah,2

int21h

movbl,max;最大值

callsub

movdl,23h;"#"分开不同数据

movah,2

int21h

movbl,min;最小值

callsub

movax,4c00h

int21h

 

subproc

movch,2

movcl,4

again2:

rolbl,cl

moval,bl

andal,0fh

cmpal,0ah

jlnext2

addal,37h;"A"-"F"

jmpdown1

next2:

addal,30h;"0"-"9"

down1:

movdl,al

movah,2

int21h

decch

jnzagain2

ret

subendp

codeends

endstart

3.

datasegment

bufdb50;定义缓冲区

db40

db40dup(0)

crlfdb0dh,0ah,'$';回车换行

dataends

stacksegmentstack

db100dup(0)

stackends

codesegment

assumeds:

data,ss:

stack,cs:

code

start:

movax,data

movds,ax

leadx,buf;输入字符串

movah,10

int21h

leadx,crlf;输出换行

movah,9

int21h

movbl,buf+1

movbh,0;计算字符串实际字符个数

movbyteptrbuf+2[bx],'$';在串尾补入'$'

leadx,buf+2

movah,9;输出字符串

int21h

movah,4ch

int21h

codeends

endstart

在这一次的实验中输出数字,需要加上30h或者37h输出才能输出实际的数字,就是在代码中用ASCII码表示,这个考试的时候忘记了,结果也没有想起来,考试的时候错了,还有就是固定格式的cs:

codeds:

datacs平时直接复制的考试的时候写成了es,真是有点遗憾。

 

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

一.实验目的

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

S1DB'The1Bitis1$'

S2DB'The2Bitis1$'

S3DB'The3Bitis1$'

S4DB'The4Bitis1$'

S5DB'The5Bitis1$'

S6DB'The6Bitis1$'

S7DB'The7Bitis1$'

S8DB'The8Bitis1$'

Dataends

codesegment

assumecs:

code,ds:

data

start:

movax,data

movds,ax

movdx,0

;-------输入BL--------

MOVBL,00001000B

MOVAL,BL

;------循环开始--------

MOVCX,8

GOGO:

SHLAL,1

;-------跳转-------------

JCEXIT

adddx,3

LOOPGOGO

;************************

EXIT:

MOVAH,9

LEASI,JMPTABLE

ADDSI,DX

JMPSI

JMPTABLE:

JMPNEARPTRL1

JMPNEARPTRL2

JMPNEARPTRL3

JMPNEARPTRL4

JMPNEARPTRL5

JMPNEARPTRL6

JMPNEARPTRL7

JMPNEARPTRL8

L1:

LEADX,S1

JMPDONE

L2:

LEADX,S2

JMPDONE

L3:

LEADX,S3

JMPDONE

L4:

LEADX,S4

JMPDONE

L5:

LEADX,S5

JMPDONE

L6:

LEADX,S6

JMPDONE

L7:

LEADX,S7

JMPDONE

L8:

LEADX,S8

DONE:

INT21H

movah,4ch

int21h

codeends

endstart

2.

;堆栈传递

Stacksegment

dw512dup(?

Stackends

Datasegment

xdw4

ydw4

zdw?

Dataends

Codesegment

assumecs:

code,ds:

data,ss:

stack

start:

movax,data

movds,ax

subsp,2

movax,x

pushax

movax,y

pushax

callP1

popz

movax,z

movbx,ax

movdx,0

movch,4

movcl,4

again:

rolbx,cl

moval,bl

andal,0fh

cmpal,0ah

jlnext

addal,37h

jmpdown

next:

addal,30h

down:

movdl,al

movah,2

int21h

decch

jnzagain

movah,4ch

int21h

P1procnear

pushbp

movbp,sp

pushax

pushbx

pushcx

pushdx

movax,6[bp];x的值

movbx,4[bp];y的值

imulbx;x*y

movcx,dx;x*y+x

movbx,ax

movax,6[bp]

cwd

addbx,ax

adccx,dx

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

cwd

subbx,ax

sbbcx,dx

mov8[bp],bx

popdx

popcx

popbx

popax

popbp

ret4

P1endp

Codeends

endstart

 

寄存器传递

Stacksegment

dw512dup(?

Stackends

Datasegment

xdw4

ydw4

zdw?

Dataends

Codesegment

assumecs:

code,ds:

data,ss:

stack

start:

movax,data

movds,ax

movax,x

movbx,y

callP1

movz,bx;bx做出口参数

movbx,z;方便查看输出是否正确

movdx,0

movch,4

movcl,4

again:

rolbx,cl

moval,bl

andal,0fh

cmpal,0ah

jlnext

addal,37h

jmpdown

next:

addal,30h

down:

movdl,al

movah,2

int21h

decch

jnzagain

movah,4ch

int21h

P1procnear

pushax

pushcx

imulbx

movcx,dx

movbx,ax

movax,x

cwd

addbx,ax

adccx,dx

movax,y

cwd

subbx,ax

sbbcx,dx

popcx

popax

ret

P1endp

Codeends

endstart

四.实验体会

在这一次的实验中的实验二的堆栈传递方式,让我很有体会,感觉和c语言中的函数相似度极高,通过自己的调试,进一步了解到了堆栈传递的细节,尤其是堆栈传递中的地址的变化,让自己体会深刻。

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

一.实验目的

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

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

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

二.实验内容

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

MIN3x,y,z,min

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

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

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

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

三.实验过程和程序

1.

MIN3macrox,y,z,min

movax,x

cmpax,y

jlnext0

movax,y

next0:

cmpax,z

jldown0

movax,z

down0:

movmin,ax

endm

datasegment

xdw13

ydw15

zdw16

mindw?

dataends

codesegment

assumecs:

code,ds:

data

start:

movax,data

movds,ax

MIN3x,y,z,min

movbx,min

movch,4

movcl,4

again:

rolbx,cl

moval,bl

andal,0fh

cmpal,0ah

jlnext

addal,37h;"A"-"F"

jmpdown

next:

addal,30h;"0"-"9"

down:

movdl,al

movah,2

int21h

decch

jnzagain

movah,4ch

int21h

codeends

endstart

2.

;汇编挂接1CH中断,正计时60秒后退出

DATASEGMENT

OLDISRDW?

?

TIMERDB100

COUNTERDW0

ISDONEDB0

DATAENDS

CODESEGMENT

ASSUMECS:

CODE,DS:

DATA

START:

MOVAX,DATA

MOVDS,AX

MOVAX,0

MOVES,AX

CLI

MOVAX,ES:

[1CH*4];保存原中断向量

MOVOLDISR[0],AX

MOVAX,ES:

[1CH*4+2]

MOVOLDISR[2],AX

MOVWORDPTRES:

[1CH*4],OFFSETISR;设置新中断向量

MOVWORDPTRES:

[1CH*4+2],SEGISR

STI

DELAY:

CMPISDONE,1

JNZDELAY

CLI

MOVAX,OLDISR[0];恢复原中断向量

MOVES:

[1CH*4],AX

MOVAX,OLDISR[2]

MOVES:

[1CH*4+2],AX

STI

MOVAH,4CH

INT21H

ISRPROCFAR

PUSHDX

PUSHAX

MOVAX,DATA

MOVDS,AX

STI

INCTIMER;执行新中断处理

CMPTIMER,1000/55

JBDONE

MOVTIMER,0

MOVAH,2

MOVDL,0DH

INT21H

MOVAX,COUNTER;打印时间

MOVDL,10

DIVDL

MOVDH,AH

MOVDL,AL

MOVAH,2

ADDDL,30H

INT21H

MOVDL,DH

ADDDL,30H

INT21H

INCCOUNTER

CMPCOUNTER,60

JLDONE

MOVISDONE,1

DONE:

PUSHF

CALLDWORDPTROLDISR;调用原中断处理

CLI

POPAX

POPDX

IRET;中断返回

ISRENDP

CODEENDS

ENDSTART

 

3.

#include

#include

usingnamespacestd;

voidmain()

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

_asm

{

movch,5

movesi,0

movcl,4

do:

rordbyte[esi],cl

incesi

decch

jnzdo

}

cout<

:

uppercase)<

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

当前位置:首页 > 法律文书 > 判决书

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

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