微机实验报告二_第1页
微机实验报告二_第2页
微机实验报告二_第3页
微机实验报告二_第4页
微机实验报告二_第5页
已阅读5页,还剩8页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

微机原理实验报告实验二班 级: 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 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 PROC 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.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,82h,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(?) ;store 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 next1 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 cxMOV 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,8mean2: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.在求有符号数的平均值时在最开始就对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,则转换为: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(?) data 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 LOOP 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 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 SEGMENT 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;将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 L

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论