NASM中减法未设置符号标志的问题排查与解决
NASM数组最小值查找中符号标志未正确设置的问题解决
我在NASM中实现数组最小值查找时遇到问题:当减法操作本应产生负数结果时,符号标志(Sign Flag)始终未被设置,导致无法正确更新最小值。调试信息显示: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指令将32位有符号数符号扩展后存入64位寄存器,修复后符号标志能正确触发。
例如,将原来的mov r14, [rbx]替换为movsx r14, DWORD [rbx],同理处理其他涉及数组值的64位寄存器赋值操作。
内容的提问来源于stack exchange,提问作者louis
相关产品推荐
相关产品推荐

