【问题标题】:Assembly: Jumping Confusion大会:跳跃混乱
【发布时间】:2015-11-10 23:25:36
【问题描述】:

我正在使用 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。出于某种原因,它只会在整个数组中添加一个数字的重复项,但这是一个完全不同的问题。任何想法或想法都非常感谢!

【问题讨论】:

  • 不确定我是否正确理解了您的问题,但您知道ret 会在call 之后返回,所以在这种情况下L4?
  • @Jester L4 被调用时我不希望它被调用,例如,L2 被调用,我输入一个数字,然后直接在之后调用 L4出于某种原因,我不确定为什么。我认为你刚才所说的听起来会有所帮助,如果你能详细说明一下。那么NextScore 中的ret 到底回到了哪里?
  • 它准确地返回到L4,因为每个ret 都返回到匹配的call 所在的位置。也就是说,如果你想做其他事情,你需要在L4 之前添加代码,当NextScore 返回时执行(例如jmp 到你想去的任何地方而不是L4)
  • @Jester 完美!感谢您的解释,它帮助很大。将其作为我问题的答案,以便我投票/选择您的答案!

标签: function assembly x86 masm irvine32


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-11-16
    • 1970-01-01
    • 1970-01-01
    • 2015-12-08
    • 1970-01-01
    • 2015-09-09
    • 2023-03-09
    • 1970-01-01
    相关资源
    最近更新 更多