组装:跳跃混乱

Assembly: Jumping Confusion

我正在使用 Irvine32.inc 库,我的 L4 跳转有问题。

    L1:
    mov edx, offset optionPromptMsg
    call WriteString
    call ReadInt
    mov ebx, 1
    cmp eax, ebx
    je L2                    //if eax is 1, jump to l2, if eax is -1, jump l3
    mov ebx, -1
    cmp eax, ebx
    je L3
    mov ebx, -2
    mov ecx, 2
    cmp ebx, eax   //if eax is less than -2 or more than 2 jump to L4
    ja L4
    cmp eax, ecx
    ja L4
    L2: call NextScore

    L4: mov edx, offset optionErrorMsg
        call WriteString

    loop L1
    L3 : call WriteScore

无论我如何格式化,出于某种原因,每次调用 L2: call NextScore 时,都会立即调用 L4,但我不明白为什么。 NextScore如下...

NextScore PROC USES esi

mov edx, offset scorePromptMsg
call WriteString
call ReadInt
mov ebx, 0
mov ecx, 100
cmp ebx, eax
ja L1
cmp eax,ecx
ja L1
jmp L2
L1:
    mov edx, offset scoreErrorMsg
    call WriteString
L2:
    mov scores[esi*4], eax
    inc esi

ret
NextScore ENDP

如您所见,NextScore 读入一个 0-100 的值,然后将这个值添加到数组 scores 中,但这次没有成功。出于某种原因,它只在整个数组中添加一个数字的重复项,但这是一个完全不同的问题。非常感谢任何想法或想法!

NextScore 末尾的 ret 正好返回到 L4,因为每个 ret 都返回到匹配 call 停止的地方继续.也就是说,如果你想做其他事情,你需要在 L4 之前添加代码,在 NextScore returns 时执行(例如 jmp 到你想去的任何地方而不是 L4):