使用以下代码作为程序的开头。写一个程序找出最大和最小的数。最大和最小的数字需要分别保存在寄存器r7和r8中。对于ARMSim#,这些数字也需要显示在控制台和LCD屏幕上(使用Embest Board) 代入量) MOV r0, #0x00002000 MOV r1, #9 STR r1, [r0],#4 MOV r1, #3 STR r1, [r0],#4 MOV r1, #1 STR r1, [r0],#4 MOV r1, #4 STR r1, [r0],#4 MOV r1, #8 STR r1, [r0],#4 MOV r1, #5 STR r1, [r0],#4 MOV r1, #7 STR r1, [r0],#4 MOV r1, #2 STR r1, [r0],#4 MOV r1, #10 STR r1, [r0],#4 MOV r1, #6 STR r1, [r0],#4,
时间: 2023-07-02 18:10:07 浏览: 91
利用汇编语言编写找出10个无符号数中最大数和最小数分别存储程序.doc
以下是一个可能的解决方案:
```
@ 初始化寄存器
MOV r7, #0 @ 最大值
MOV r8, #0x7FFFFFFF @ 最小值,初始化为2^31-1
@ 读取数组元素并查找最大/最小值
MOV r0, #0x00002000 @ 数组首地址
MOV r1, #10 @ 数组长度
Loop:
LDR r2, [r0], #4 @ 读取数组元素
CMP r2, r7 @ 比较当前元素和最大值
BGT UpdateMax @ 如果大于最大值,跳转到更新最大值的代码
CMP r2, r8 @ 比较当前元素和最小值
BLT UpdateMin @ 如果小于最小值,跳转到更新最小值的代码
B Continue @ 否则继续循环
UpdateMax:
MOV r7, r2 @ 更新最大值
B Continue
UpdateMin:
MOV r8, r2 @ 更新最小值
B Continue
Continue:
SUBS r1, #1 @ 减少计数器
BNE Loop @ 如果计数器不为零,继续循环
@ 在控制台和LCD屏幕上显示结果(对于Embest Board)
MOV r0, #0x10000000 @ 控制台输出地址
MOV r1, r7 @ 最大值
MOV r2, #10 @ 十进制
BL DisplayInt @ 显示最大值
MOV r0, #0x10000000 @ 控制台输出地址
MOV r1, r8 @ 最小值
MOV r2, #10 @ 十进制
BL DisplayInt @ 显示最小值
MOV r0, #0x08000100 @ LCD屏幕输出地址
MOV r1, r7 @ 最大值
MOV r2, #10 @ 十进制
BL DisplayInt @ 显示最大值
MOV r0, #0x08000200 @ LCD屏幕输出地址
MOV r1, r8 @ 最小值
MOV r2, #10 @ 十进制
BL DisplayInt @ 显示最小值
@ 显示整数的子例程
DisplayInt:
PUSH {lr} @ 保存返回地址
MOV r3, #0 @ 计数器
CMP r1, #0 @ 处理负数情况
BGE Positive @ 如果是非负数,直接跳转到Positive标签
NEG r1 @ 否则取相反数,并在控制台输出减号
MOV r4, #45 @ ASCII码值为45表示减号
STRB r4, [r0], #1
Positive:
MOV r4, #0 @ 初始化数字的字符串缓冲区
ADD r4, r4, #12 @ 缓冲区指针指向最后一个字符的位置
STRB r4, [r0], #-1 @ 将缓冲区指针递减并存储结束符
Loop:
MOV r2, r1, LSR #1 @ 将数字除以10,并将商存储到r2中
MOV r2, r2, LSL #1
ADD r2, r2, r2, LSL #2 @ r2 = r2*5 = r2*2 + r2*8
SUB r1, r2, r1, LSR #31 @ r1 = r1 - r2*10,相当于r1%=10
ADD r1, r1, #'0' @ 将数字转换为ASCII码
STRB r1, [r4], #-1 @ 将字符存储到缓冲区中
ADD r3, r3, #1 @ 增加计数器
CMP r3, #10 @ 如果已经处理完10个数字,跳出循环
BNE Loop
MOV r4, #12 @ 指向数字字符串的第一个字符
CMP r3, #0 @ 处理数字为0的情况
BEQ Zero
Loop2:
LDRB r1, [r4], #1 @ 读取数字字符串中的字符
STRB r1, [r0], #1 @ 将字符输出到控制台或LCD屏幕
SUBS r3, #1 @ 减少计数器
BNE Loop2
POP {pc} @ 恢复返回地址并返回
Zero:
MOV r1, #'0' @ 将数字0转换为ASCII码
STRB r1, [r0], #1 @ 将字符输出到控制台或LCD屏幕
POP {pc} @ 恢复返回地址并返回
```
注意:这是一份较为详细的代码,包含了对于负数和0的处理,以及在控制台和LCD屏幕上显示结果的代码。你可以根据具体需求进行简化或修改。
阅读全文