You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.26 22:42:39