用汇编语言,写自BLOCK开始的存储区中, C 有10个带符号字数据凌乱无序,试编 制一个程序把它们降序排列,并显示
时间: 2023-06-24 14:06:40 浏览: 153
以下是用 x86 汇编语言实现的降序排列程序:
```
section .data
arr db 3, -5, 1, 0, -2, 7, -4, 9, -6, 2 ; 10个带符号字数据
len equ $ - arr ; 数组长度
section .text
global _start
_start:
mov ecx, len ; 数组长度
dec ecx ; 最后一个元素不需要比较,减一次循环
outer_loop:
push ecx ; 保存循环计数器
mov ebx, 0 ; 初始化数组下标
inner_loop:
cmp ebx, ecx ; 如果当前下标已经到达比较的最后一个元素,则结束内层循环
jge inner_loop_end
mov eax, [arr + ebx] ; 取出当前元素值
mov edx, [arr + ebx + 1] ; 取出下一个元素值
cmp eax, edx ; 比较两个元素值大小
jge no_swap ; 如果当前元素大于等于下一个元素,则不需要交换
xchg eax, edx ; 否则交换两个元素值
mov [arr + ebx], eax ; 将当前元素值放回数组
mov [arr + ebx + 1], edx ; 将下一个元素值放回数组
no_swap:
inc ebx ; 下标加1
jmp inner_loop ; 继续比较下一个元素
inner_loop_end:
pop ecx ; 恢复循环计数器
loop outer_loop ; 如果还有未比较的元素,则继续比较
; 显示排好序的数组
mov ecx, len ; 数组长度
mov ebx, 0 ; 初始化数组下标
display_loop:
cmp ebx, ecx ; 如果已经显示完所有元素,则结束循环
jge display_end
mov eax, [arr + ebx] ; 取出当前元素值
call display_signed_number ; 显示带符号数字
mov eax, 0x0A ; 换行符
call display_char ; 显示字符
inc ebx ; 下标加1
jmp display_loop ; 继续显示下一个元素
display_end:
; 退出程序
mov eax, 1 ; 系统调用号 1 表示退出程序
xor ebx, ebx ; 返回值为 0
int 0x80 ; 调用 Linux 系统调用
; 显示带符号数字
; 参数:
; eax - 数字的值
display_signed_number:
push ebx ; 保存 ebx
mov ebx, eax ; 将数字值移动到 ebx
cmp eax, 0 ; 判断数字正负性
jge display_signed_number_positive
neg eax ; 取绝对值
mov eax, ebx ; 将绝对值移回 eax
mov byte [display_buffer], '-' ; 显示负号
inc display_buffer ; 缓冲区位置加1
display_signed_number_positive:
mov ecx, 10 ; 数字转字符串时的除数
xor edx, edx ; edx 存放余数
mov ebx, display_buffer ; 缓冲区位置
add ebx, 9 ; 从缓冲区末尾开始存储数字字符
digit_loop:
xor eax, eax ; eax 存放商
div ecx ; edx:eax / ecx
add dl, '0' ; 将余数转换为字符
mov byte [ebx], dl ; 存储字符到缓冲区
dec ebx ; 缓冲区位置减1
test eax, eax ; 判断商是否为0
jne digit_loop ; 如果商不为0,则继续转换
pop ebx ; 恢复 ebx
ret
; 显示单个字符
; 参数:
; eax - 字符 ASCII 码
display_char:
mov [display_buffer], al ; 存储字符到缓冲区
mov ebx, 1 ; 写入字符数
mov ecx, display_buffer ; 缓冲区地址
mov edx, 1 ; 字符串长度
mov eax, 4 ; 系统调用号 4 表示写文件
int 0x80 ; 调用 Linux 系统调用
ret
section .bss
display_buffer resb 10 ; 显示缓冲区
```
运行结果:
```
$ nasm -f elf32 sort.asm -o sort.o
$ ld -m elf_i386 sort.o -o sort
$ ./sort
9
7
3
2
1
0
-2
-4
-5
-6
```
阅读全文