|
7#

楼主 |
发表于 2009-12-6 15:21:08
|
只看该作者
交换指令在冒泡法中的使用
程序代码:# bubble.s - An example of the XCHG instruction
.section .data
values:
.int 105, 235, 61, 315, 134, 221, 53, 145, 117, 5
.section .text
.global _start
_start:
movl $values, %esi
movl $9, %ecx
movl $9, %ebx
loop:
movl (%esi), %eax
cmp %eax, 4(%esi)
jge skip
xchg %eax, 4(%esi)
movl %eax, (%esi)
skip:
add $4, %esi
dec %ebx
jnz loop
dec %ecx
jz end
movl $values, %esi
movl %ecx, %ebx
jmp loop
end:
movl $1, %eax
movl $0, %ebx
int $0x80 编译链接:$ as -gstabs -o bubble.o bubble.s
$ ld -o bubble bubble.o
通过 gdb 调试,可以看到,数组被重新排序:Breakpoint 1, end () at bubble.s:32
32 movl $1, %eax
Current language: auto
The current source language is "auto; currently asm".
(gdb) x/9d &values
0x80490b0 <values>: 5 53 61 105
0x80490c0 <values+16>: 117 134 145 221
0x80490d0 <values+32>: 235 315 程序说明:
索引数组用 ESI 寄存器,一开始 ESI 寄存器中装入 values 数组的始地址。
排序总共使用两层循环,内层循环一次要使所有遍历到的元素中最大的那个掉到最底;而每一次的遍历元素个数都要比上一次少 1 个;数组中一共有 10 个元素,外层循环需要进行 9 次才能完成最终完成排序任务。 |
|