汇编语言实验报告.docx

上传人:b****4 文档编号:5410075 上传时间:2022-12-16 格式:DOCX 页数:21 大小:374.21KB
下载 相关 举报
汇编语言实验报告.docx_第1页
第1页 / 共21页
汇编语言实验报告.docx_第2页
第2页 / 共21页
汇编语言实验报告.docx_第3页
第3页 / 共21页
汇编语言实验报告.docx_第4页
第4页 / 共21页
汇编语言实验报告.docx_第5页
第5页 / 共21页
点击查看更多>>
下载资源
资源描述

汇编语言实验报告.docx

《汇编语言实验报告.docx》由会员分享,可在线阅读,更多相关《汇编语言实验报告.docx(21页珍藏版)》请在冰豆网上搜索。

汇编语言实验报告.docx

汇编语言实验报告

合肥工业大学

计算机与信息学院

实验报告

课程:

汇编语言程序设计

专业班级:

计算机科学与技术09-2班

学号:

20092662

姓名:

张东升

实验一Debug程序的使用

一实验目的

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

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

二实验内容

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

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

–R↙

如:

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

(DI)=0000,(CS)=0c1d,(IP)=0100。

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

0200H,DS:

0204H、DS:

0208H单元的内容

–D20020B↙

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

–G=1100116↙

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

0200H~DS:

020BH字节单元中的内容

–D20020B↙

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

注意:

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

●指令执行的时候,IP寄存器随着变化,注意观察。

实验结果分析

1、程序运行结果:

(AX)=0000,(BX)=0000

DS:

0208H四字节单元的内容:

c9740649

2、试用寄存器间接寻址方式编写程序段,完成上述程序段的功能。

(参考下列程序流程图)

 

 

三实验过程和程序

按照上述要求在debug中进行数据输入,把结果填在表格中。

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

在实验结果看来与理论结果相符

五实验体会

通过老师的认真传授和耐心指导,我终于在重新输入了好多次之后得到了证实的实验结果,debug的使用是一个特别消耗耐心的编程过程,非常容易出现错误,但是只要我们把握住一个耐心的编程思想,多动手多动脑,就会很快熟练这门学科的。

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

一.实验目的

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

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

二.实验内容

求一个班10名学生成绩的平均值(最大值和最小值,并将结果显示出来)

三.实验过程和程序

CodeSegment

AssumeCS:

Code,DS:

Code

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

;功能:

显示指定地址(Str_Addr)的字符串

;入口:

;Str_Addr=字符串地址(要求在数据段)

;用法:

OutputStr_Addr

;用法举例:

OutputPromptStr

OutputMACROStr_Addr

leadx,Str_Addr

movah,9

int21h

EndM

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

;功能:

输出一个字符

;入口:

dl=要显示的字符

Output_ChrprocNear

pushax

movah,02h

int21h

popax

ret

Output_ChrEndp

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

;功能:

输出回车换行

Output_CTLFprocNear

pushax

pushdx

movah,02h

movdl,0dh

int21h

movdl,0ah

int21h

popdx

popax

ret

Output_CTLFEndp

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

;功能:

把AX中的二进制无符号数转换成显式的十进制ASCII码,并送显示屏显示

;入口:

AX=二进制数

;出口:

在当前光标位置显示转换后的ASCII码数字

Dec_ASCIIProcNear

pushds

pushcs

popds

pushcs

popes

pushdx

pushbx

pushdi

movbx,10

leadi,@@Temp_Save[6]

movBYTEptr[di],'$'

decdi

cld

@@Divide:

xordx,dx

divbx

ordl,30h

mov[di],dl

decdi

testax,0ffffh

jnz@@Divide

incdi

pushdi

popdx

movah,9

int21h

popdi

popbx

popdx

popds

ret

@@Temp_Savedb7dup(?

Dec_ASCIIEndP

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

;功能:

把AL中的二进制无符号数作为小数转换成显式的十进制ASCII码,

;并送显示屏显示,未考虑四舍五入

;入口:

AH=二进制数,BH=除数,CX=保留小数位数

;出口:

在当前光标位置显示转换后的ASCII码数字

Dec_FracProcNear

pushax

movdl,'.'

callOutput_Chr;显示一个小数点

popax

movbl,10;乘数

@@Dec_Frac:

moval,ah;余数不为0,处理小数部分

mulbl;余数乘10,继续做除法

divbh;除以除数,取商数作为结果的一位小数

oral,30h

movdl,al

callOutput_Chr;显示一位小数

loop@@Dec_Frac

ret

Dec_FracEndP

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

SCOREdb56,69,84,82,73,88,99,63,100,80;成绩单

Elementsequ($-SCORE)/TypeSCORE;元素个数

RESULTdb6dup(0);各分数段计数

SUMdw0;总分

AVERdb?

;平均分

prompt_Resdb'00---59:

$'

prompt_Avedb13,10,'Average:

$';提示显示平均分

Press_Keydb13,10,13,10,'Thecomplated.Pressanykeytoexit...$'

Start:

pushcs

popds

pushcs

popes;使数据段、附加段与代码段同段

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

;统计低于60分、60-69、70-79、80-89、90-100各分数段人数并显示

leasi,SCORE;成绩首地址

movcx,Elements;成绩数目

movdl,10;用于除10

cld

@@Statics:

lodsb;提取成绩

xorah,ah

addSUM,ax;累计总分

divdl;除10

cmpal,5;>5,及格

jg$+4

moval,5;<=5,不及格

subal,5;减5,分数段计数地址偏移量

cbw;

pushax

popbx

incRESULT[bx];计数增1

loop@@Statics;循环,统计下一个成绩

moval,RESULT[5];取100分人数

addRESULT[4],al;加到90-100分数段

movbl,59h

movcx,5

leasi,RESULT;各分数段计数数组首地址

leadx,prompt_Res;统计结果字符串地址

List_Res:

movah,9;显示分数段提示信息

int21h

lodsb;读入计数值

xorah,ah

callDec_ASCII;显示统计结果

callOutput_CTLF;输出一个回车、换行

moval,bl

incal

daa

movbl,al

pushcx

movcl,4

xorah,ah

shlax,cl

shral,cl

orax,3030h

xchgah,al

movWORDptrPrompt_Res,ax

moval,bl

addal,9

movbl,al

xorah,ah

shlax,cl

shral,cl

orax,3030h

xchgah,al

movWORDptrPrompt_Res[5],ax

popcx

loopList_Res

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

;计算并显示平均分

Outputprompt_Ave;提示显示平均分

movbl,Elements

movax,SUM;取总分

divbl;平均分取整数部分

movAVER,al;保存平均分

xorah,ah

callDec_ASCII;显示平均分

Exit_Proc:

leadx,Press_Key;提示操作完成,按任意键结束程序

movah,9

int21h

movah,1

int21h

movah,4ch;结束程序

int21h

CodeENDS

ENDStart;编译到此结束

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

 

五,实验体会

本次试验应用到的知识比较多,程序比较复杂,代码段比较长,但是在熟悉设计思路之后,费点功夫还是可以设计出来的,通过本次试验,我知道明白了汇编语言的高效性和复杂性,并且初步具备了简单的编程能力。

 

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

一.实验目的

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

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

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

二.实验内容

完成Word型二进制,十进制和十六进制的相互转换,包括从键盘输入和屏幕输出功能。

要求:

1.功能选择。

2.转换使用子程序实现,且:

二进制到十进制和十六进制转换使用内存传递参数;十进制到二进制和十六进制转换使用寄存器传递参数;十六进制到二进制和十进制转换使用堆栈传递参数。

3.输出使用子程序实现。

三.实验过程和程序

datasegment

bufferdb6,?

6dup(?

mess1db0ah,0dh,"Inputanumberplease:

$"

mess2db0ah,0dh,"Thebytenumberis:

$"

mess3db0ah,0dh,"Thedecadenumberis:

$"

mess4db0ah,0dh,"Thehexdecimalnumberis:

$"

hextabdb"0123456789abcdef"

c10dw10

xdw?

dataends

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

codesegment

assumecs:

code,ds:

data

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

start:

movax,data

movds,ax

leadx,mess1

movah,9

int21h

leadx,buffer

movah,0ah

int21h

;输入一个十进制数

movcl,buffer+1

movch,0

leabx,buffer+2

movax,0

one:

mulc10

movdl,[bx]

anddl,0fh

addal,dl

adcah,0

incbx

loopone

movx,ax

movsi,ax;把二进制数送给si,作十六进制转换

leadx,mess2

movah,9

int21h

movcl,10h

bit:

shlx,1

jctwo

movbl,'0'

jmpthree

two:

movbl,'1'

three:

movdl,bl

movah,02h

int21h

;输出二进制

loopbit

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

movcl,buffer+1

leadx,mess3

movah,9

int21h

leabx,buffer+2

decs:

movdl,[bx]

movah,02h

int21h

incbx

loopdecs

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

leadx,mess4

movah,9

int21h

movcx,4

leabx,hextab

hex:

pushcx

movcl,4

rolsi,cl

movax,si

andax,000fh

xlat

movdl,al

movah,2

int21h

popcx

loophex

movax,4c00h

int21h

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

codeends

endstart

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

五.实验体会

本次试验重点难点在与子程序的管理和调用,这道题是汇编语言之中的一道经典题,数制转换核心在于一个转换思想,这个思想可以应用到很多方面,通过本次试验熟练了各种小程序的使用和各种指令的运用,虽然当时遇到了很多麻烦,但是最终还是把结果显示出来了,我以后一定要多加练习编程,提高自己的逻辑思维能力。

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

一.实验目的

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

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

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

二.实验内容

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

MIN3x,y,z,mix

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

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

三.实验过程和程序

1.Minmacrox,y,z

localContinue,Change,Change2,Down

pushax

pushdx

moval,x

cmpal,y

jgChange

Continue:

cmpal,z

jgChange2

jmpDown

Change:

moval,y

jmpContinue

Change2:

moval,z

Down:

movdl,al

movah,2

int21h

popdx

popax

endm

dsegsegment

msgdb0dh,0ah,'pleaseinputnum:

$'

msg2db0dh,0ah,'theminnumis:

$'

p1db?

p2db?

p3db?

dsegends

csegsegment

assumecs:

cseg,ds:

dseg

Start:

movax,dseg

movds,ax

movdx,offsetmsg

movah,9

int21h

movah,1

int21h

movp1,al

movah,9

int21h

movah,1

int21h

movp2,al

movah,9

int21h

movah,1

int21h

movp3,al

movdx,offsetmsg2

movah,9

int21h

Minp1,p2,p3

movah,4ch

int21h

csegends

endStart

2:

IntNoequ1ch

Tlenequ59

dsegsegment

Counterdw0

Timerdw0

IsDonedb0

CR=0dh

LF=0ah

MsgdbCR,LF,'$'

dsegends

csegsegment

assumecs:

cseg,ds:

dseg

OldInt1Cdd?

Mainproc

movax,dseg

movds,ax

movax,0

moves,ax

movax,es:

[IntNo*4]

movwordptrcs:

OldInt1C,ax

movax,es:

[IntNo*4+2]

movwordptrcs:

OldInt1C+2,ax

cli

movwordptres:

[IntNo*4],offsetTimerISR

moves:

[IntNo*4+2],cs

sti

Waiter:

cmpIsDone,1

jnzWaiter

 

cli

movax,wordptrcs:

OldInt1C

moves:

[IntNo*4],ax

movax,wordptrcs:

OldInt1C+2

moves:

[IntNo*4+2],ax

sti

movax,4c00h

int21h

Mainendp

 

TimerISRprocfar

sti

pushds

pushax

movax,dseg

movds,ax

addTimer,55

cmpTimer,1000

jbDone

movTimer,0

 

movah,2

movdl,13

int21h

 

movax,Counter

movdl,10

divdl

movdh,ah

movdl,al

adddl,30h

movah,2

int21h

movdl,dh

adddl,30h

movah,2h

int21h

incCounter

 

movah,0bh

int21h

oral,al

jnzCharReady

skip:

cmpCounter,60

jbDone

movIsDone,1

jmpDone

CharReady:

movah,1

int21h

cmpal,61h

jneskip

leadx,Msg

movah,09h

int21h

movCounter,0

Done:

pushf

calldwordptrOldInt1C

cli

popax

popds

iret

TimerISRendp

csegends

endMain

 

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

五.实验体会

通过本次试验,我对汇编语言的了解更加深入了一步,并掌握了一定的编程技巧,宏是汇编编程当中的比较重要的一部分,学习和使用之后为我们以后深入汇编语言打下了良好的基础。

 

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

当前位置:首页 > 解决方案 > 学习计划

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

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