我的汇编器是YASM,我正在64位Linux上编码。
我使用yasm -f elf -m amd64 -g dwarf2 filename.asm
进行汇编,并使用ld进行链接。
我正在尝试实现选择排序。 rdi
和 rsi
指向strbuf2 resb 10
数组的不同部分。为什么会发生分段错误?第105行和第106行执行完全相同的操作,为什么它崩溃在第106行而不是第105行?
我包含了代码的相关部分,以及它在崩溃时的gdbtui截图。
更新:计数器已修复。
; ====== Sorting begins here ======
; Register uses:
; bpl holds the current minimum value
; r8 holds the memory address of the current minimum value
; rdi points to the boundary of the "outer loop"
; rsi points to the boundary of the "inner loop"
sorting:
mov rdi, strbuf2 ; outer loop pointer
mov rsi, strbuf2+1 ; inner loop pointer
mov rax, 1 ; inner loop counter
mov rbx, 0 ; outer loop counter
innerloop:
mov bpl, [rdi] ; assume beginning element of unsorted array is minimum
; store the value of first element of unsorted array
mov dl, [rdi]
; compare the current small value with the value in rsi
mov cl, [rsi]
cmp bpl, cl
jg new_small
inc rsi
inc rax
cmp rax, 9
jle innerloop
jg innerloop_done
new_small:
inc rax
mov bpl, cl; save the new small value
mov r8, rsi ; save its index
inc rsi
cmp rax, 9
jle innerloop
innerloop_done:
; When the inner loop is completed...
; First, do the swap
; to swap r8 (target memory address) with [rdi] (outer array boundary)
mov dl, 0 ; initialise
mov dl, [rdi]
mov [rdi], bpl
mov [r8], dl
inc rdi ; move the outer loop pointer forward
inc rsi ; move the inner loop pointer forward
inc rbx ; increment the outer loop counter (the unsorted array becomes smaller)
; set the inner loop counter to the appropriate position
mov rax, 1
add rax, rbx ; now rax (inner loop counter)
; will always be rbx+1 (outer loop counter + 1)
cmp rbx, 9
jle innerloop
; ====== Sorting ends here ======
段错误 gdb 输出
mov r9b,[rdi]
会导致gdb中r9b的void
值。我正在努力弄清楚为什么:( - InvalidBrainExceptionmov [r8],r10
将整个r10
寄存器(8字节)写入保存在r8
中的地址,您应该只写入一个字节。 - DCoderr8b
而非r8
来解决这个问题,但是在执行语句mov [r8], r10
后,r8b
值为空。我在 gdb 中检查寄存器时发现了这一点。 - InvalidBrainException