信工实验参考——《微机实验2》

一般来说,我贴上来的代码都是能直接跑的,如果不行可以邮箱交流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 屏幕输出测试

 

  • 6
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值