设有10个无符号数的字节序列,利用子程序的方法编程,求出该序列中的最大值和最小值

只为记录汇编实验(子程序设计)

题目:编写程序,设有10个无符号数的字节序列,利用子程序的方法编程,求出该序列中的最大值和最小值。最大值放在BH,最小值放在BL(显示一位16进制)

代码如下:

;编写程序,设有10个无符号数的字节序列,利用子程序的方法编程,求出该序列中的最大值和最小值。
;最大值放在BH,最小值放在BL(显示一位16进制)   
DATA SEGMENT
    ARRAY DB 15,1,2,3,0,8,14,13,10,5 ;定义数组  
    LEN  DB $-ARRAY                  ;定义字符串长度
    CRLF DB 0AH,0DH,'$'              ;定义换行
    STR1 DW 'THE MAX NUMBER IS:$'    ;定义输入输出提示语句
    STR2 DW 'THE MIN NUMBER IS:$'
DATA ENDS
CODE SEGMENT
    ASSUME CS:CODE ,DS:DATA
START:
    MOV AX,DATA
    MOV DS,AX
                       
    XOR CX,CX            ;cx初始化
    MOV CL,LEN           ;把len长度赋值给cl,按照题目要求,也可以用MOV CL,10也可以
    SUB CL,1
    
    MOV SI,OFFSET ARRAY  ;使指针si指向array
    MOV BH,[SI]          ;把si指向的内容赋值给bh
    MOV BL,[SI]          ;把si指向的内容赋值给bl
    INC SI               ;si指针自增1
      
    CALL FIND            ;执行find子程序,其程序功能是找出最大与最小值
    
    MOV DX,OFFSET STR1   ;输出提示语句
    MOV AH,9H
    INT 21H
    
    MOV DL,BH            ;把bh内容赋值给dl
    CALL PRINT           ;执行print子函数    
   
    MOV DX,OFFSET CRLF   ;换行
    MOV AH,9
    INT 21H
    
    MOV DX,OFFSET STR2   ;输出提示语句
    MOV AH,9
    INT 21H
    
    MOV DL,BL            ;把bl内容赋值给dl
    CALL PRINT           ;执行print子程序
                 
    MOV AH,4CH           ;结束程序
    INT 21H 

FIND PROC
X:  MOV AL,[SI]     ;把si指向地址的内容赋值给AL
    
    CMP AL,BL       ;al和bl比较
    JB  CHANGE_BL   ;如果al比较小则跳change_bl函数
    
F:  CMP AL,BH       ;al和bh比较
    JA CHANGE_BH    ;如果al比较大则跳转change_bh函数

NEXT:
    INC SI    ;si指针自增1
    LOOP X    ;做循环 当cl=0时,退出循环执行下一条语句
    JMP OVER  ;跳到over函数

CHANGE_BL:    ;把al的值赋给bl
    MOV BL,AL
    JMP F     ;跳f函数

CHANGE_BH:    ;把al的值赋给bh
    MOV BH,AL
    JMP NEXT  ;跳next函数

OVER:         ;结束子函数
    RET
FIND ENDP                   
        

PRINT PROC     
    CMP DL,9  ;dl与9比较
    JB NEXT1  ;跳next1函数
    ADD DL,7  ;因为dl>9因此要转换成A-F的格式
    
NEXT1:
    ADD DL,30H;dl+30H转ascll码输出
    MOV AH,02H;输出dl
    INT 21H    
    RET       ;结束子程序
PRINT ENDP        

CODE ENDS
END START

 

  • 10
    点赞
  • 66
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,针对您的问题,需要先明确一下目标平台的架构和数据类型。请问您所提到的平台是什么?数据类型是什么? 针对您的要,最大解可以直接采用一个简单的循环迭代实现,比如: ``` ldr r0, =Src // 加载数据源地址到寄存器 r0 ldr r1, [r0] // 加载第一个10个数(无符号数)到寄存器 r1 mov r2, r1 // 将 r1 的数复制到 r2 ,作为初始最大 mov r3, #9 // 保存剩余迭代次数 add r0, r0, #4 // 移动到下一个数的地址 loop: ldr r1, [r0] // 加载下一个数 cmp r1, r2 // 比较当前数与最大 bgt update_max // 如果大于最大,则更新最大 sub r3, r3, #1 // 次数减 1 add r0, r0, #4 // 移动到下一个地址 bne loop // 继续迭代直到完成 update_max: mov r2, r1 // 更新最大 sub r3, r3, #1 // 次数减 1 add r0, r0, #4 // 移动到下一个地址 bne loop // 继续迭代直到完成 ldr r0, =Dst // 加载结果存储地址到寄存器 r0 str r2, [r0] // 将最大存储到目标地址 ``` 这段代码将源数据的地址存储在 r0 ,将目标地址存储在 r1 ,通过循环迭代加载源数据的每个并与当前最大比较,最终更新最大并将结果存储到目标地址。 以上做法是在 ARM Cortex-M 架构的嵌入式系统进行开发的示例。具体的语言和指令集依赖于具体的平台架构和数据类型。如有任何疑问,请随时向我提

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值