已知在 DATA 开始的字单元中存放有 10 个无符号整数,试编制程序挑选出其 中的最大值和最小值并显示。
时间: 2024-05-12 22:21:12 浏览: 110
```
section .data
numbers db 10, 20, 30, 40, 50, 60, 70, 80, 90, 100
section .text
global _start
_start:
; 初始化最大值和最小值为第一个数
mov eax, [numbers]
mov ebx, [numbers]
; 循环比较,更新最大值和最小值
mov ecx, 1 ; ecx 为计数器
mov edx, 9 ; edx 为循环次数
loop_start:
cmp ecx, edx
jgt loop_end
mov esi, ecx
add esi, esi ; esi = ecx * 2
mov edi, [numbers + esi] ; edi = 第 ecx 个数
cmp edi, eax ; 比较当前数和最大值
jle not_max
mov eax, edi ; 更新最大值
jmp not_min
not_max:
cmp edi, ebx ; 比较当前数和最小值
jge not_min
mov ebx, edi ; 更新最小值
not_min:
inc ecx ; 计数器加 1
jmp loop_start
loop_end:
; 显示最大值和最小值
mov eax, 4 ; 系统调用号 4 表示输出
mov ebx, 1 ; 文件描述符 1 表示标准输出
mov ecx, max_msg ; 输出最大值的提示信息
mov edx, max_msg_len ; 提示信息长度
int 0x80
mov eax, 4 ; 系统调用号 4 表示输出
mov ebx, 1 ; 文件描述符 1 表示标准输出
mov ecx, eax ; 输出最大值
call print_number
mov eax, 4 ; 系统调用号 4 表示输出
mov ebx, 1 ; 文件描述符 1 表示标准输出
mov ecx, min_msg ; 输出最小值的提示信息
mov edx, min_msg_len ; 提示信息长度
int 0x80
mov eax, 4 ; 系统调用号 4 表示输出
mov ebx, 1 ; 文件描述符 1 表示标准输出
mov ecx, ebx ; 输出最小值
call print_number
; 退出程序
mov eax, 1 ; 系统调用号 1 表示退出程序
xor ebx, ebx ; 返回值为 0
int 0x80
print_number:
; 将 eax 中的数转化为字符串并输出
push ebx ; 保存文件描述符
mov ebx, esp ; 将栈指针保存到 ebx 中
push eax ; 将数压入栈中
mov ecx, esp ; 将栈指针保存到 ecx 中
mov eax, 0 ; 清空 eax
; 循环求出数的位数
loop_start:
cmp dword [ecx], 0 ; 判断数是否为 0
jz loop_end
add eax, 1 ; 位数加 1
add ecx, 4 ; 栈指针加 4
jmp loop_start
loop_end:
mov ebx, esp ; 将栈顶指针保存到 ebx 中
sub ebx, eax ; 计算字符串的起始地址
mov edx, eax ; 将字符串长度保存到 edx 中
mov eax, 4 ; 系统调用号 4 表示输出
mov ecx, 1 ; 文件描述符 1 表示标准输出
int 0x80
pop ebx ; 恢复文件描述符
ret
section .data
max_msg db "最大值为:", 0x0a ; 换行符
max_msg_len equ $ - max_msg
min_msg db "最小值为:", 0x0a ; 换行符
min_msg_len equ $ - min_msg
```
上述代码使用了一个 `print_number` 子程序来将一个无符号整数转化为字符串并输出。该子程序首先将数压入栈中,然后循环求出数的位数,并将字符串的起始地址保存到 `ebx` 中。最后,调用系统调用 4 将字符串输出到标准输出。
阅读全文