《微机实验报告二.doc》由会员分享,可在线阅读,更多相关《微机实验报告二.doc(12页珍藏版)》请在课桌文档上搜索。
1、 . . 微机原理实验报告微机实验二一、实验目的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地址里字母看是否小
2、写字母 不是 是 转换为大写字母存入str2里的地址循环字符串个数次结束代码:data segmentorg 2000h str1 dbAedc123!*sdeDIO71$ count equ $-str1org 3000h str2 db count dup(?) data ends STACK SEGMENT PARA STACK STACKDB 100 DUP (?) STACK ENDS CODE SEGMENTASSUME CS:CODE,DS:DATASTART PROC FARPUSH DSMOV AX,0PUSH AXMOV AX,DATAMOV DS,AXLEA SI,str
3、1;取str1首地址LEA DI,str2;取str2首地址MOV CX,count AA:MOV AL,SICMP AL,61H ;判断是否为小写字母 nextCMP AL,7AH JA nextSUB AL,20H ;将小写字母转换为大写MOV DI, AL ;将非小写字母放入str2中 next:MOV DI, ALINC SIINC DILOOP AA RETSTART ENDP CODE ENDSENDSTART结果:1.2.debug调试:修改str1字符串的值,运行看结果。结果:1.2.问题:1.未注意到LOOP循环的结束条件是CX为0,故设计时应该用MOVE CX, COUNT
4、这样的语句,执行一次自减一,直到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 res
5、2 db 3 dup(?) ;store signed data ends画流程图开始结束求得平均值DIV SUM CX采用Loop循环将各个数值相加将数据逐一比较大小,求得最大值与最小值输入数据段和堆栈段代码:data segmentorg 2000h num db 12h,95h,0f1h,0c2h,82h,2h,10h,34h count equ $-numorg 3000h res1 db 3 dup(?) ;store unsignedorg 4000h res2 db 3 dup(?) ;store signed data ends STACK SEGMENT PARA STACK
6、 STACKDB 100 DUP (?) STACK ENDS CODE SEGMENTASSUME CS:CODE,DS:DATASTART PROC FARPUSH DSMOV AX,0PUSH AXMOV AX,DATAMOV DS,AXLEA SI,numLEA DI,res1MOV CX,count-1MOV AL,SI;求无符号数最大值a: INC SICMP AL,SI JA next1MOV AL,SInext1: LOOP aMOV DI,AL ;求无符号数最小值LEA SI,numMOV CX,count-1MOV AL,SIINC DIb: INC SICMP AL,SI
7、 next2MOV AL,SI next2: LOOP bMOV 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,numLEA DI,res2 MOV CX,count-1MOV AL,SIa2: INC SICMP AL,SI JG next3MOV AL,SInext3: LOOP a2
8、MOV DI,AL ;求有符号数最小值LEA SI,numMOV CX,count-1MOV AL,SIINC DIb2: INC SICMP AL,SI JL next4MOV AL,SI next4: LOOP b2MOV DI,AL ;求有符号数的平均值 LEA SI,numXOR DI,DIXOR BX,BXMOV 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;有符号相
9、除LEA DI,RES2MOV DI2,ALRETSTART ENDP CODE ENDSENDSTART结果: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,使储存向下一
10、个地址进行。5.最开始时发现有符号数求平均与无符号数相等,修改为有符号数求和时要先扩为字,再扩为双字,这样符号位才不会遗失。6.求和时di使用前未清零,导致错误相加,修改后先将di清零再相加。3、数码转换:将字数据转换为ASCII码表示的十进制数。字数据的值域为065535,最多可转换为五位十进制数。例如:字数据为0ffffh,则转换为:65535已知数据段的定义:data segment org 2000h num dw 65535 org 2010h data ends画流程图开始将NUM里的数给一个寄存器用65535依次除num1数组里的数将每次的余数作为被除数并将每次的余数作为被除数并
11、将每次的余数作为被除数并将每次的余数作为被除数 循环5次每一次商存在地址RES中结束代码:data segmentorg 2000h num dw 65535org 3000h num1 dw 10000,1000,100,10,1;定义一个被除数数组,偏移地址为3000horg 2010h res db 5 dup(?) data endsSTACKS SEGMENTDB 100 DUP (?)STACKS ENDSCODES SEGMENTASSUME CS:CODES,DS:DATA,SS:STACKSSTART:MOV AX,DATAMOV DS,AXLEA SI,numMOV AX,
12、SILEA DI,resMOV cx,5LEA SI,num1A:MOV BX,SI INC SIINC SIDIV BX ;AX/BXADD AL,0030H;将al转成ASCII码MOV DI,ALMOV AX,DX ; 将余数给axMOV DX,0000H;将dx清零INC DI LOOP A MOV AH,4CH INT 21HCODES ENDSENDSTARTDebug调试1.在2010h2014h存储单元为:36,35,35,33,35。2)修改num,运行看结果。修改num为46728结果:出现的问题:1.要让SI指向下一个余数必须自增2,即要用到两次INC SI;INC SI
13、2. 每次循环时要取出余数作为下一次的被除数 ,同时将寄存器清零4、数码转换:将字数据转换为ASCII码表示的十六进制数。字数据的值域为065535,最多可转换为四位十六进制数。例如:字数据为0ffffh,则转换为:FFFF已知数据段的定义:data segment org 2000hnum dw 54A8h org 2010h res db 4 dup(?) data ends画流程图开始结束用54A8依次除num1数组里的数商存在地址RES中将NUM里的数给一个寄存器将AL送入寄存器商是否小于10AL加30h转化为ASCII码AL加37h转化为ASCII码循环4次 是 不是 代码:data
14、s segmentorg 2000h num dw 54A8Horg 2010h res db 4 dup(?) org 3000h num1 dw 1000h,100h,10h,1h ;定义一个被除数数组,偏移地址为3000h datas endsSTACKS SEGMENTDB 100 DUP (?)STACKS ENDSCODES SEGMENTASSUME CS:CODES,DS:DATAS,SS:STACKSSTART:MOV AX,DATASMOV DS,AXLEA SI,numMOV AX,SILEA DI,resMOV cx,4LEA SI,num1A:MOV BX,SI IN
15、C SIINC SIDIV BX ;AX/BXCMP AL,10 ;比较al与10的大小 NEXT;AL大于10ADD AL,37h;将al转成ASCII码MOV DI,ALMOV AX,DX ; 将余数给axMOV DX,0000H;将dx清零INC DI LOOP A JMP EXITNEXT:AL小于10ADD AL,30h;将al转成ASCII码MOV DI,ALMOV AX,DX ; 将余数给axMOV DX,0000H;将dx清零INC DI LOOP A JMP EXITEXIT:MOV AH,4CH INT 21HCODES ENDSENDSTARTDebug 调试:1)查看运行结果应该为:在2010h2013h存储单元为:35,34,41,38。2)修改num,运行看结果。修改num为5C1F结果: 问题: 1. 完整执行完next后没有跳到exit,导致运行不正确,加入JMP EXIT后程序运行正常。总结:CBW、CWD的用法;Loop的用法;附加段的用法堆栈的用法Dos中21h的调用:输出字符与结束12 / 12