我正在尝试实现两个缩进循环,如下面的屏幕截图所示。调试器显示r13等于0且r14等于9。为什么然后它跳过JL指令并直接转到mov r13,0指令
我怀疑中间的inc指令对此负责,但是这没有任何意义,因为该标志的位仍然保持不变
pop r10 ; contains the size of the array
pop rax ; address of the array in memory
mov r11, rax ; copy of the address from rax now
mov r12, 0 ; int i
mov r13, 0 ; int j
dec r10
i_loop:
mov r14, r10
sub r14, r12
j_loop:
mov r8, [r11 + r13 * 8]
mov r9, [r11 + r13 * 8 + 8]
cmp r8, r9
jg swap
back:
inc r13
cmp r13, r14
jl j_loop
mov r13, 0
inc r12
cmp r12, r10
jl i_loop
标志(也称为条件代码)是一组1位寄存器。该cmp
指令集。但是,除了许多指令之外,cmp
还设置了条件代码,而还有许多指令则没有。因此,每当在比较和分支之间有其他指令时,都应检查指令集引用以查看该指令是否还设置了条件代码。您还应该能够在调试器中检查条件代码(1位寄存器)。您会在看到正确设置它们cmp
,然后在重新设置它们inc
。
另请参阅https://stackoverflow.com/a/3925620/471129 re:inc指令
和https://stackoverflow.com/a/5210401/471129 re:在gdb中看到标志-使用info reg eflags
或layout reg
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句