设有一数据区有10个有符号数的字节数据(如55,78H,43,-19,0,1,10,80H,0FFH,100),位于数据段偏移地址为1000H开始的10个内存单元中。编写程序找出其中的最大数和最小数,分别存入BH和BL;然后求其中最大值和最小值的平均值,存入AL。 要求:将求最大最小值设计为子程序,并画出子程序流程图;在主程序里调用该子程序、求平均值,并绘制主程序流程图。
时间: 2023-11-27 14:50:27 浏览: 71
两个8031单片机之间的数据通信.doc
子程序流程图:
```
┌───┐
│Start│
└───┘
│
│
▼
┌─────────┐
│LoadData │
└─────────┘
│
│
▼
┌──────────┐
│FindMaxMin │
└──────────┘
│
│
▼
┌────────────┐
│StoreMaxMin │
└────────────┘
│
│
▼
┌───────┐
│Return │
└───────┘
```
主程序流程图:
```
┌───┐
│Start│
└───┘
│
│
▼
┌─────────┐
│Call Sub1 │
└─────────┘
│
│
▼
┌──────────┐
│CalculateAL│
└──────────┘
│
│
▼
┌───────┐
│Return │
└───────┘
```
下面是汇编代码:
```
ORG 1000H
data SEGMENT
db 55H, 78H, 43H, -19, 0, 1, 10, 80H, 0FFH, 100
data ENDS
code SEGMENT
assume cs:code, ds:data
start:
mov ax, data
mov ds, ax
; 调用子程序找最大最小值
call FindMaxMin
; 计算平均数
mov bl, bh ; 将最大值复制到BL
sub bl, al ; BL = 最大值 - 平均数
mov bh, al ; 将平均数存入BH
add bh, bl ; BH = 平均数 + (最大值 - 平均数)
mov al, bh ; 将BH存入AL
; 结束程序
mov ax, 4c00h
int 21h
; 查找最大最小值
FindMaxMin:
; 初始化变量
mov si, 0 ; si指向第一个数
mov bh, -128 ; 将BH初始化为最小值
mov bl, 127 ; 将BL初始化为最大值
find_next:
cmp si, 10 ; 检查是否检查完毕
je return
mov al, [si] ; 获取当前数
cmp al, bh ; 检查是否是最小值
jl update_min
cmp al, bl ; 检查是否是最大值
jg update_max
jmp next
update_min:
mov bh, al ; 存储最小值
jmp next
update_max:
mov bl, al ; 存储最大值
jmp next
next:
inc si ; si指向下一个数
jmp find_next
return:
ret
code ENDS
END start
```
阅读全文