大会:跳跃混乱

时间:2015-11-10 23:25:36

标签: function assembly x86 masm irvine32

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

1 个答案:

答案 0 :(得分:4)

ret末尾的NextScore完全返回L4,因为每个ret都会返回以继续匹配call停止的位置。也就是说,如果您想要执行其他操作,则需要在L4之前添加代码,NextScorejmp返回时执行(例如L4,而不是$s ="INSERT into cuporder(nama,no_hp,add) VALUES('$nama','$no_hp','$add')"; 而不是sum(diag(apply(m,2,rev))) 1}}):