1

这是Y86代码供参考

.pos 0
irmovq stack, %rsp        # initialize stack pointer
call main
halt

.align 8
input_array:
.quad 6
.quad 4
.quad 5
.quad 2
.quad 3
.quad 1

count:
.quad 6

main:
irmovq input_array, %rdi
irmovq count, %rsi
mrmovq (%rsi), %rsi
call bubble_sort
ret

# bubble_sort(long *data, long count)
bubble_sort:
irmovq $1, %rcx
subq %rcx, %rsi             # last = count - 1
irmovq $8, %r14             # %r14 = sizeof(int*)
rrmovq %rdi, %r13           # %r13 = data

outer_loop:
rrmovq %r13, %rdi           # data = data (param)
irmovq $0, %rbx             # i = 0
inner_loop:

mrmovq (%rdi), %r9          # %r9 = data[i]
addq %r14, %rdi             # data += 1
mrmovq (%rdi), %r10         # %r10 = data[i + 1]

if_statement:
rrmovq %r9, %r11
subq %r10, %r11             # %r11 = data[i] - data[i + 1]
jg then                     # if data[i] > data[i + 1], goto then
jmp end_if

then:
rrmovq %r10, %r11           # temp = data[i + 1]
rmmovq %r9, (%rdi)          # data[i + 1] = data[i]
rmmovq %r11, -8(%rdi)       # data[i] = temp

end_if:
addq %rcx, %rbx             # i++
rrmovq %rbx, %rax           # %rax = i
subq %rsi, %rax             # %rax = i - last
jl inner_loop               # goto inner_loop if i < last

subq %rcx, %rsi             # last--
jg outer_loop               # goto outer_loop if last > 0

ret

.pos 0x100
stack:

作为参考,我正在使用这个Y86-64 模拟器。在完成第一个内部循环序列后,就会出现问题。%rsi 中的寄存器值为 4,我刚刚在处理 jg 指令之前从 %rsi 的前一个值中减去了 1,但它仍然没有跳转到 outer_loop。

4

0 回答 0