为什么 NASM 中的这个减法没有设置符号标志?

问题描述 投票:0回答:0

我试图在 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

GDB debugger output

我在调试器中为示例提供的输入是:100、75、50、80、110

我尝试同时使用 cmp [rbx]、r14 和上述减法。我希望设置符号标志并将 50 设置为新的最小值,但从未设置符号标志,因此它会跳过 mov r14,[rbx]

更新:看来我已经修好了。我错误地将 32 位值放入 64 位寄存器中。我做过一次

movsx (dest), DWORD [rbx]

成功了。谢谢

arrays assembly nasm eflags
© www.soinside.com 2019 - 2024. All rights reserved.