微机实验报告二.docx

上传人:b****1 文档编号:20155986 上传时间:2023-04-25 格式:DOCX 页数:20 大小:279.25KB
下载 相关 举报
微机实验报告二.docx_第1页
第1页 / 共20页
微机实验报告二.docx_第2页
第2页 / 共20页
微机实验报告二.docx_第3页
第3页 / 共20页
微机实验报告二.docx_第4页
第4页 / 共20页
微机实验报告二.docx_第5页
第5页 / 共20页
点击查看更多>>
下载资源
资源描述

微机实验报告二.docx

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

微机实验报告二.docx

微机实验报告二

微机原理实验报告

 

实验二

 

班级:

2012级信息工程(7)班

姓名:

学号:

序号:

 

评阅分数:

微机实验二

一、实验目的

1、熟悉80X86基本指令集。

2、掌握汇编语言源程序的编写。

3、掌握结构化程序设计三大结构的程序设计。

4、掌握汇编程序的动态调试。

二、开发环境

未来汇编、debug

三、实验题目

1、编程将以‘$’结束的字符串中的小写字母改为大写字母。

①已知数据段的定义:

datasegment

org2000h

str1db‘Aedc123!

*sdeDIO71$’

countequ$-str1

org3000h

str2dbcountdup(?

dataends

②画流程图

 

 

不是

 

代码:

datasegment

org2000h

str1db'Aedc123!

*sdeDIO71$'

countequ$-str1

org3000h

str2dbcountdup(?

dataends

STACKSEGMENTPARASTACK'STACK'

DB100DUP(?

STACKENDS

CODESEGMENT

ASSUMECS:

CODE,DS:

DATA

STARTPROCFAR

PUSHDS

MOVAX,0

PUSHAX

MOVAX,DATA

MOVDS,AX

LEASI,str1;取str1首地址

LEADI,str2;取str2首地址

MOVCX,count

AA:

MOVAL,[SI]

CMPAL,61H;判断是否为小写字母

JBnext

CMPAL,7AH

JAnext

SUBAL,20H;将小写字母转换为大写

MOV[DI],AL;将非小写字母放入str2中

next:

MOV[DI],AL

INCSI

INCDI

LOOPAA

RET

STARTENDP

CODEENDS

ENDSTART

 

结果:

1.

2.

③debug调试:

修改str1字符串的值,运行看结果。

结果:

1.

2.

问题:

1.未注意到LOOP循环的结束条件是CX为0,故设计时应该用MOVECX,COUNT这样的语句,执行一次自减一,直到CX为0不执行循环。

2.Loop循环中出现问题,应该把INCSI和INCDI放在循环中比较语句后

3.比较后直接写的next语句,忘记还要执行一个MOV[DI],AL,从而导致输出一直为0.

 

2、有一个字节型数组,求最大值、最小值和平均值:

1)作为无符号数,2)作为带符号。

①已知数据段的定义:

datasegment

org2000h

numdb12h,95h,0f1h,0c2h,82h,2h,10h,34h

countdb$-num

org3000h

res1db3dup(?

);storeunsigned

org4000h

res2db3dup(?

);storesigned

dataends

②画流程图

 

 

 

代码:

datasegment

org2000h

numdb12h,95h,0f1h,0c2h,82h,2h,10h,34h

countequ$-num

org3000h

res1db3dup(?

);storeunsigned

org4000h

res2db3dup(?

);storesigned

dataends

STACKSEGMENTPARASTACK'STACK'

DB100DUP(?

STACKENDS

CODESEGMENT

ASSUMECS:

CODE,DS:

DATA

STARTPROCFAR

PUSHDS

MOVAX,0

PUSHAX

MOVAX,DATA

MOVDS,AX

LEASI,num

LEADI,res1

MOVCX,count-1

MOVAL,[SI]

;求无符号数最大值

a:

INCSI

CMPAL,[SI]

JAnext1

MOVAL,[SI]

next1:

LOOPa

MOV[DI],AL

;求无符号数最小值

LEASI,num

MOVCX,count-1

MOVAL,[SI]

INCDI

b:

INCSI

CMPAL,[SI]

JBnext2

MOVAL,[SI]

next2:

LOOPb

MOV[DI],AL

;求无符号数平均值

LEASI,num

LEADI,RES1

MOVCX,count

XORBX,BX

mean:

MOVAL,[SI];将数放在al

CWD;扩为32位,跳过符号

ADDBX,AX

INCSI

LOOPmean

MOVAX,BX;将求和结果放回al

MOVcx,count

DIVcx

MOV[DI][2],AL

;有符号数最大值

LEASI,num

LEADI,res2

MOVCX,count-1

MOVAL,[SI]

a2:

INCSI

CMPAL,[SI]

JGnext3

MOVAL,[SI]

next3:

LOOPa2

MOV[DI],AL

;求有符号数最小值

LEASI,num

MOVCX,count-1

MOVAL,[SI]

INCDI

b2:

INCSI

CMPAL,[SI]

JLnext4

MOVAL,[SI]

next4:

LOOPb2

MOV[DI],AL

;求有符号数的平均值                                                                                                                                             

LEASI,num

XORDI,DI

XORBX,BX

MOVCX,8

mean2:

MOVAL,[SI]

CBW;先扩成16位

CWD;再将符号位扩充至dx

ADDBX,AX

ADCDI,DX;符号位无进位相加,只保留0或1

INCSI

LOOPmean2

MOVAX,BX

MOVDX,DI

MOVCX,8

IDIVCX;有符号相除

LEADI,RES2

MOV[DI][2],AL

RET

STARTENDP

CODEENDS

ENDSTART

 

结果:

1.无符号数

2.有符号数

出现的问题:

1.未注意到数据比较时比较的次数为COUNT-1次。

第一次用COUNT次进行循环时,会使最小值为0.

2.在求平均值是未注意到要除以count次,不是count-1

3.在求有符号数的平均值时在最开始就对res2取址:

LEADI,RES2,忽略了在后面一步需要用到ADCDI,DX,导致最后一步MOV[DI][2],AL时出错,应该把LEADI,RES2放在ADCDI,DX之后才不会对所存的数产生影响

4.每一次大段操作完记得INCSI,使储存向下一个地址进行。

5.最开始时发现有符号数求平均与无符号数相等,修改为有符号数求和时要先扩为字,再扩为双字,这样符号位才不会遗失。

6.求和时di使用前未清零,导致错误相加,修改后先将di清零再相加。

3、数码转换:

将字数据转换为ASCII码表示的十进制数。

字数据的值域为0~65535,最多可转换为五位十进制数。

例如:

字数据为0ffffh,则转换为:

‘65535’

①已知数据段的定义:

datasegment

org2000h

numdw65535

org2010h

dataends

②画流程图

 

循环5次

 

代码:

datasegment

org2000h

numdw65535

org3000h

num1dw10000,1000,100,10,1;定义一个被除数数组,偏移地址为3000h

org2010h

resdb5dup(?

dataends

STACKSSEGMENT

DB100DUP(?

STACKSENDS

CODESSEGMENT

ASSUMECS:

CODES,DS:

DATA,SS:

STACKS

START:

MOVAX,DATA

MOVDS,AX

LEASI,num

MOVAX,[SI]

LEADI,res

MOVcx,5

LEASI,num1

A:

MOVBX,[SI]

INCSI

INCSI

DIVBX;AX/BX

ADDAL,0030H;将al转成ASCII码

MOV[DI],AL

MOVAX,DX;将余数给ax

MOVDX,0000H;将dx清零

INCDI

LOOPA

MOVAH,4CH

INT21H

CODESENDS

ENDSTART

Debug调试

1.在2010h~2014h存储单元为:

36,35,35,33,35。

2)修改num,运行看结果。

修改num为46728

结果:

出现的问题:

1.要让SI指向下一个余数必须自增2,即要用到两次INCSI;

INCSI

2.每次循环时要取出余数作为下一次的被除数,同时将寄存器清零

 

4、数码转换:

将字数据转换为ASCII码表示的十六进制数。

字数据的值域为0~65535,最多可转换为四位十六进制数。

例如:

字数据为0ffffh,则转换为:

‘FFFF’

①已知数据段的定义:

datasegment

org2000h

numdw54A8h

org2010h

resdb4dup(?

dataends

②画流程图

 

 

循环

4次

 

是不是

 

代码:

datassegment

org2000h

numdw54A8H

org2010h

resdb4dup(?

org3000h

num1dw1000h,100h,10h,1h;定义一个被除数数组,偏移地址为3000h

datasends

STACKSSEGMENT

DB100DUP(?

STACKSENDS

CODESSEGMENT

ASSUMECS:

CODES,DS:

DATAS,SS:

STACKS

START:

MOVAX,DATAS

MOVDS,AX

LEASI,num

MOVAX,[SI]

LEADI,res

MOVcx,4

LEASI,num1

A:

MOVBX,[SI]

INCSI

INCSI

DIVBX;AX/BX

CMPAL,10;比较al与10的大小

JBNEXT

;AL大于10

ADDAL,37h;将al转成ASCII码

MOV[DI],AL

MOVAX,DX;将余数给ax

MOVDX,0000H;将dx清零

INCDI

LOOPA

JMPEXIT

NEXT:

AL小于10

ADDAL,30h;将al转成ASCII码

MOV[DI],AL

MOVAX,DX;将余数给ax

MOVDX,0000H;将dx清零

INCDI

LOOPA

JMPEXIT

EXIT:

MOVAH,4CH

INT21H

CODESENDS

ENDSTART

Debug调试:

1)查看运行结果应该为:

在2010h~2013h存储单元为:

35,34,41,38。

2)修改num,运行看结果。

修改num为5C1F

结果:

问题:

1.完整执行完next后没有跳到exit,导致运行不正确,加入JMPEXIT后程序运行正常。

 

总结:

CBW、CWD的用法;

Loop的用法;

附加段的用法

堆栈的用法

Dos中21h的调用:

输出字符及结束

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

当前位置:首页 > 人文社科 > 哲学历史

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

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