我试图在 NASM 的数组中找到最小值。我的阵列设置正常,但我一直遇到未设置符号标志的问题,即使产生了负面结果。
这是问题的 GDB 调试器。 R8 是数组中的当前值, R14是最小值的位置, R9 是 [rbx] - r14 的输出(如果找到新的最小值,它应该是负数)。
这是数组定义。
%define ARRAY_SIZE 5
segment .bss
myArray: resd ARRAY_SIZE
数组由用户输入填充,这是执行此操作的代码:
inputLoop:
add r12, 1 ;used to count number of elements
push rcx
push rdi
mov rdi, inputPrompt
call printf
mov rdi, intFormat
mov rsi, intInput
call scanf
add r13, [intInput] ;this is for the sum of all inputs
xor rax, rax
mov eax, [intInput]
pop rdi
stosd
pop rcx
loop inputLoop
;;set up array access
mov rbx, myArray
mov rcx, r12
;;set up max and min
xor r14, r14
xor r15, r15
mov r14, [rbx]
mov r15, [rbx]
这是处理查找最小值和最大值的循环(现在只关注最小值)
minMaxLoop:
push rcx
push rsi
xor r9, r9
mov r8, [rbx] ;used for debugging
;;comparisons - min
mov r9, [rbx]
sub r9, r14
jns returnMin
mov r14, [rbx]
returnMin: ;;-max
cmp r15, [rbx]
jge returnMax
mov r15, [rbx]
returnMax:
pop rsi
pop rcx
add rbx, 4
loop minMaxLoop
jmp printStuff
我在调试器中为示例提供的输入是:100、75、50、80、110
我尝试同时使用 cmp [rbx]、r14 和上述减法。我希望设置符号标志并将 50 设置为新的最小值,但从未设置符号标志,因此它会跳过 mov r14,[rbx]
更新:看来我已经修好了。我错误地将 32 位值放入 64 位寄存器中。我做过一次
movsx (dest), DWORD [rbx]
成功了。谢谢