【发布时间】: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