《微机实验报告二(共13页).doc》由会员分享,可在线阅读,更多相关《微机实验报告二(共13页).doc(13页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、精选优质文档-倾情为你奉上微机原理实验报告实验二班 级: 2012级信息工程(7)班 姓 名: 学 号: 序 号: 评阅分数: 微机实验二一、实验目的1、熟悉80X86基本指令集。2、掌握汇编语言源程序的编写。3、掌握结构化程序设计三大结构的程序设计。4、掌握汇编程序的动态调试。二、开发环境未来汇编、debug三、实验题目1、编程将以$结束的字符串中的小写字母改为大写字母。已知数据段的定义:data segment org 2000h str1 db Aedc123!*sdeDIO71$ count equ $-str1 org 3000h str2 db count dup(?) data
2、ends画流程图开始将str1、str2的地址分别给SI、DI可变寄存器判断str1地址里字母看是否小写字母 不是 是 转换为大写字母存入str2里的地址循环字符串个数次结束 代码:data segment org 2000h str1 db Aedc123!*sdeDIO71$ count equ $-str1 org 3000h str2 db count dup(?) data ends STACK SEGMENT PARA STACK STACK DB 100 DUP (?) STACK ENDS CODE SEGMENT ASSUME CS:CODE,DS:DATASTART PRO
3、C FAR PUSH DS MOV AX,0 PUSH AX MOV AX,DATA MOV DS,AX LEA SI,str1 ;取str1首地址 LEA DI,str2 ;取str2首地址 MOV CX,count AA: MOV AL,SI CMP AL,61H ;判断是否为小写字母 JB next CMP AL,7AH JA next SUB AL,20H ;将小写字母转换为大写 MOV DI, AL ;将非小写字母放入str2中 next: MOV DI, AL INC SI INC DI LOOP AA RET START ENDP CODE ENDS END START结果:1.
4、2.debug调试:修改str1字符串的值,运行看结果。结果:1.2.问题:1.未注意到LOOP循环的结束条件是CX为0,故设计时应该用MOVE CX, COUNT这样的语句,执行一次自减一,直到CX为0不执行循环。2. Loop 循环中出现问题,应该把INC SI 和 INC DI放在循环中比较语句后3. 比较后直接写的next语句,忘记还要执行一个 MOV DI, AL,从而导致输出一直为0.2、有一个字节型数组,求最大值、最小值和平均值:1)作为无符号数,2)作为带符号。已知数据段的定义:data segment org 2000h num db 12h,95h,0f1h,0c2h,82
5、h,2h,10h,34h count db $-num org 3000h res1 db 3 dup(?) ;store unsigned org 4000h res2 db 3 dup(?) ;store signed data ends画流程图开始结束求得平均值DIV SUM CX采用Loop循环将各个数值相加将数据逐一比较大小,求得最大值与最小值输入数据段和堆栈段 代码:data segment org 2000h num db 12h,95h,0f1h,0c2h,82h,2h,10h,34h count equ $-num org 3000h res1 db 3 dup(?) ;st
6、ore unsigned org 4000h res2 db 3 dup(?) ;store signed data ends STACK SEGMENT PARA STACK STACK DB 100 DUP (?) STACK ENDS CODE SEGMENT ASSUME CS:CODE,DS:DATASTART PROC FAR PUSH DS MOV AX,0 PUSH AX MOV AX,DATA MOV DS,AX LEA SI,num LEA DI,res1 MOV CX,count-1 MOV AL,SI ;求无符号数最大值a: INC SI CMP AL,SI JA ne
7、xt1 MOV AL,SInext1: LOOP a MOV DI,AL ;求无符号数最小值 LEA SI,num MOV CX,count-1 MOV AL,SI INC DIb: INC SI CMP AL,SI JB next2 MOV AL,SI next2: LOOP b MOV DI,AL ;求无符号数平均值LEA SI,numLEA DI,RES1MOV CX,countXOR BX,BXmean:MOV AL,SI ;将数放在alCWD;扩为32位,跳过符号ADD BX,AXINC SILOOP meanMOV AX,BX;将求和结果放回alMOV cx,countDIV cx
8、MOV DI2,AL ;有符号数最大值 LEA SI,num LEA DI,res2 MOV CX,count-1 MOV AL,SIa2: INC SI CMP AL,SI JG next3 MOV AL,SInext3: LOOP a2 MOV DI,AL ;求有符号数最小值 LEA SI,num MOV CX,count-1 MOV AL,SI INC DIb2: INC SI CMP AL,SI JL next4 MOV AL,SI next4: LOOP b2 MOV DI,AL ;求有符号数的平均值 LEA SI,numXOR DI,DIXOR BX,BX MOV CX,8mean
9、2:MOV AL,SI CBW ;先扩成16位CWD ;再将符号位扩充至dxADD BX,AX ADC DI,DX ;符号位无进位相加,只保留0或1INC SILOOP mean2MOV AX,BX MOV DX,DIMOV CX,8IDIV CX;有符号相除LEA DI,RES2MOV DI2,ALRET START ENDP CODE ENDS END START结果:1. 无符号数2.有符号数出现的问题:1.未注意到数据比较时比较的次数为COUNT-1次。第一次用COUNT次进行循环时,会使最小值为0.2.在求平均值是未注意到要除以count次,不是count-13.在求有符号数的平均值
10、时在最开始就对res2取址:LEA DI,RES2,忽略了在后面一步需要用到ADC DI,DX,导致最后一步MOV DI2,AL时出错,应该把LEA DI,RES2放在ADC DI,DX之后才不会对所存的数产生影响4.每一次大段操作完记得INC SI,使储存向下一个地址进行。5.最开始时发现有符号数求平均与无符号数相等,修改为有符号数求和时要先扩为字,再扩为双字,这样符号位才不会遗失。6.求和时di使用前未清零,导致错误相加,修改后先将di清零再相加。3、数码转换:将字数据转换为ASCII码表示的十进制数。字数据的值域为065535,最多可转换为五位十进制数。例如:字数据为0ffffh,则转换
11、为:65535已知数据段的定义:data segment org 2000h num dw 65535 org 2010h data ends画流程图开始将NUM里的数给一个寄存器 用65535依次除num1数组里的数将每次的余数作为被除数并将每次的余数作为被除数并将每次的余数作为被除数并将每次的余数作为被除数 循环5次每一次商存在地址RES中结束代码:data segment org 2000h num dw 65535 org 3000h num1 dw 10000,1000,100,10,1;定义一个被除数数组,偏移地址为3000h org 2010h res db 5 dup(?) d
12、ata endsSTACKS SEGMENT DB 100 DUP (?)STACKS ENDSCODES SEGMENT ASSUME CS:CODES,DS:DATA,SS:STACKSSTART: MOV AX,DATA MOV DS,AX LEA SI,num MOV AX,SI LEA DI,res MOV cx,5 LEA SI,num1A: MOV BX,SI INC SI INC SI DIV BX ;AX/BX ADD AL,0030H;将al转成ASCII码 MOV DI,AL MOV AX,DX ; 将余数给ax MOV DX,0000H;将dx清零 INC DI LOO
13、P A MOV AH,4CH INT 21HCODES ENDS END STARTDebug调试1.在2010h2014h存储单元为:36,35,35,33,35。2)修改num,运行看结果。修改num为46728结果:出现的问题:1.要让SI指向下一个余数必须自增2,即要用到两次INC SI; INC SI2. 每次循环时要取出余数作为下一次的被除数 ,同时将寄存器清零 4、数码转换:将字数据转换为ASCII码表示的十六进制数。字数据的值域为065535,最多可转换为四位十六进制数。例如:字数据为0ffffh,则转换为:FFFF已知数据段的定义:data segment org 2000h
14、 num dw 54A8h org 2010h res db 4 dup(?) data ends画流程图开始结束用54A8依次除num1数组里的数商存在地址RES中将NUM里的数给一个寄存器将AL送入寄存器商是否小于10AL加30h转化为ASCII码AL加37h转化为ASCII码 循环4次 是 不是 代码: datas segment org 2000h num dw 54A8H org 2010h res db 4 dup(?) org 3000h num1 dw 1000h,100h,10h,1h ;定义一个被除数数组,偏移地址为3000h datas endsSTACKS SEGMEN
15、T DB 100 DUP (?)STACKS ENDSCODES SEGMENT ASSUME CS:CODES,DS:DATAS,SS:STACKSSTART: MOV AX,DATAS MOV DS,AX LEA SI,num MOV AX,SI LEA DI,res MOV cx,4 LEA SI,num1A: MOV BX,SI INC SI INC SI DIV BX ;AX/BX CMP AL,10 ;比较al与10的大小 JB NEXT ;AL大于10 ADD AL,37h;将al转成ASCII码 MOV DI,AL MOV AX,DX ; 将余数给ax MOV DX,0000H
16、;将dx清零 INC DI LOOP A JMP EXITNEXT:AL小于10 ADD AL,30h;将al转成ASCII码 MOV DI,AL MOV AX,DX ; 将余数给ax MOV DX,0000H;将dx清零 INC DI LOOP A JMP EXITEXIT: MOV AH,4CH INT 21HCODES ENDS END STARTDebug 调试: 1)查看运行结果应该为:在2010h2013h存储单元为:35,34,41,38。 2)修改num,运行看结果。修改num为5C1F结果: 问题: 1. 完整执行完next后没有跳到exit,导致运行不正确,加入JMP EXIT后程序运行正常。总结: CBW、CWD的用法;Loop的用法;附加段的用法堆栈的用法Dos中21h的调用:输出字符及结束 专心-专注-专业