一般来说,我贴上来的代码都是能直接跑的,如果不行可以邮箱交流1902946954@qq.com
仅供参考,微机的老师讲的很好,所以请还是要先自己完成咯。
免责声明,本人菜只因一只,内容仅供参考,错了不负责哈。
微机实验二报告
一:实验目的
1、熟悉80X86基本指令集。
2、掌握汇编语言源程序的编写方法:程序结构、返回DOS的方法、段地址的初始化、存储单元的访问等。
3、掌握分支结构和循环结构的程序设计方法。
4、掌握DEBUG动态调试。
二:实验题目
2.1:题目1
编程将以‘$’结束的字符串中的大写字母改为小写字母,显示字符串,并统计大写字母的个数。
①已知数据段的定义:
data segment
org 2000h
str1 db ‘AeHdc123!*sLdeDIO71ok’,0AH,0DH,‘$’
count equ $-str1
org 2030h
str2 db count dup(?) ;存放处理后的字符串
num db ? ;存放大写字母的统计个数
data ends
②运行显示:多次修改str1字符串的值,再次运行看结果,测试算法的正确性。
③debug调试:查看内存单元,统计大写字母的个数。
2.1.1:源代码
DATAS SEGMENT ;数据段
org 2000h
str1 db 'AeHdc123!*sLdeDIO71ok',0AH,0DH,'$'
count equ $-str1
org 2030h
str2 db count dup(?) ;存放处理后的字符串
num db ? ;存放大写字母的统计个数
DATAS ENDS
STACKS SEGMENT
;此处输入堆栈段代码
STACKS ENDS
CODES SEGMENT
ASSUME CS:CODES,DS:DATAS,SS:STACKS
START:
MOV AX,DATAS
MOV DS,AX
;代码段
;将大写字母改为小写字母
LEA SI,str2
LEA BX,str1
MOV CX,COUNT
MOV DL,0
NEXT:MOV AL,[BX]
INC BX
CMP AL,41H
JB AGAIN
CMP AL,5AH
JA AGAIN
ADD AL,20H
INC DL
AGAIN:MOV [SI],AL ;将处理好的字符串MOV到str2中
INC SI
LOOP NEXT
MOV num,DL
;通过9号功能在屏幕上显示
MOV AX,SEG str2
MOV DS,AX
MOV DX, OFFSET str2
MOV AH,9
INT 21H
MOV AH,4CH
INT 21H
CODES ENDS
END START
2.1.2:实验结果截图
图2.1.2.a屏幕输出
图2.1.2.b 内存查看
2.2:题目2
有一个带符号字节型数组,求最大值、最小值、总和和平均值。
①已知数据段的定义:
data segment
org 2000h
num db 12h,95h,0f1h,0c2h,82h,2h,10h,34h
count equ $-num
org 2010h
sum dw ?
res db 3 dup(?) ;最大值、最小值和平均值
data ends
②debug调试:修改num,运行看结果。
2.2.1:源代码
DATAS SEGMENT ;数据段设置
org 2000h
num db 12h,95h,0f1h,0c2h,82h,2h,10h,34h
count equ $-num
org 2010h
sum dw ?
res db 3 dup(?) ;最大值、最小值和平均值
DATAS ENDS
STACKS SEGMENT
;此处输入堆栈段代码
STACKS ENDS
CODES SEGMENT
ASSUME CS:CODES,DS:DATAS,SS:STACKS
START:
MOV AX,DATAS
MOV DS,AX
;此处输入代码段代码
;最大值
MOV CX,08H
LEA BX,num
MOV AL,[BX]
AGAIN: INC BX ;循环查找
CMP AL,[BX]
JGE NEXT ;不大于则跳转不更新
MOV AL,[BX] ;大于则更新
NEXT:LOOP AGAIN
MOV res,AL
;最小值
MOV CX,08H
LEA BX,num
MOV AL,[BX]
AGAIN1: INC BX ;循环查找
CMP AL,[BX]
JLE NEXT1 ;不小于则跳转,不更新
MOV AL,[BX] ;小于则更新
NEXT1:LOOP AGAIN1
MOV DI,01H
MOV res[DI],AL
;加和
MOV CX,08H
LEA SI,num
MOV sum,0
ADD1:
MOV AL,[SI]
CBW ;将AL拓展为AX(字节变为字)
INC SI
ADD sum,AX
LOOP ADD1 ;用循环加和
;求平均值
MOV AX,sum
MOV BL,08H
IDIV BL ;带符号除法,商为8位放在AL,舍去AH中的余数
MOV DI,02H
MOV res[DI],AL
MOV AH,4CH
INT 21H
CODES ENDS
END START
2.2.2:实验结果截图
图2.2.2.a内存查看
2.3:题目3
将下面数据段的数据,在屏幕上显示。
①已知数据段的定义:
data segment
time db 2,0,2,0,0,4,2,1
str1 db ‘Happy New Day!$’
data ends
②运行看输出显示结果。
2.3.1:源代码
DATAS SEGMENT ;数据段设置
time db 2,0,2,0,0,4,2,1
str1 db 'Happy New Day!$'
DATAS ENDS
STACKS SEGMENT
;此处输入堆栈段代码
STACKS ENDS
CODES SEGMENT
ASSUME CS:CODES,DS:DATAS,SS:STACKS
START:
MOV AX,DATAS
MOV DS,AX
;代码段
;输出time
MOV CX,08H
LEA SI,time
NEXT1:
MOV DL,30H
ADD DL,[SI]
MOV AH,02H ;使用功能2
INT 21H
INC SI
LOOP NEXT1
;输出str1
MOV AX,SEG str1
MOV DS,AX
MOV DX,OFFSET str1
MOV AH,9 ;使用功能9
INT 21H
MOV AH,4CH
INT 21H
CODES ENDS
END START
2.3.2:实验结果截图
图2.3.2.a 屏幕输出测试