Jump if not equal 即使相等时仍然跳

Jump if not equal is still jumping even when equal

include 'win32ax.inc'
.code
start:
mov bx, 60
mov ax, 60
cmp ax, bx
jne inv
inv:
invoke MessageBoxA, NULL, "Hello!", "Notice:", NULL, MB_OK
invoke ExitProcess, 0
.end start  

BX & AX 都是60,为什么跳到标签调用消息框?它正在这样做。

何塞的工作解决方案:

include 'win32ax.inc'
.code
start:
mov bx, 60
mov ax, 60
cmp ax, bx
jne inv
jmp THEY_ARE_EQUAL
inv:
invoke MessageBoxA, NULL, "Hello!", "Notice:", NULL, MB_OK
invoke ExitProcess, 0

THEY_ARE_EQUAL:
invoke ExitProcess, 0
.end start  

您的标签紧跟在您的 jne 指令之后,因此即使没有发生跳转,下一条执行的指令也是相同的。将标签向下移动一行,然后重试;然后你就会看到不同。

您已经有了一个标签,以防 AX BX 不相等。添加另一个标签,以防它们相等:

mov bx, 60
mov ax, 60
cmp ax, bx
jne inv              ;JUMPS TO INV IF AX BX AREN'T EQUAL.
jmp THEY_ARE_EQUAL   ;JUMPS TO THEY_ARE_EQUAL IF AX BX ARE AEQUAL.
inv:
...
JMP continue       ;SKIP "THEY_ARE_EQUAL".
THEY_ARE_EQUAL:  
...
continue:

我有一段时间没有编写 Applesoft Basic 了……几十年了……

这是您的程序的样子:

10 a = 5
20 b = 5
30 if a <> b then goto 40
40 PRINT "Here I am!"
50 END

这是您的首选修复方法:

10 a = 5
20 b = 5
30 if a <> b then goto 50
40 goto 60
50 PRINT "Here I am!"
60 END

这是简化版:

10 a = 5
20 b = 5
30 if a = b then goto 50
40 PRINT "Here I am!"
50 END

如您所见,简化版少了一行,因此更可取。

他告诉你使用更简单的方法。将您的标签移到 MessageBoxA 调用之后,并将分支类型更改为相反的类型,je:

include 'win32ax.inc'
.code
start:
mov bx, 60
mov ax, 60
cmp ax, bx
je skip
invoke MessageBoxA, NULL, "Hello!", "Notice:", NULL, MB_OK
skip:
invoke ExitProcess, 0
.end start

并且由于无论哪种方式都使用代码 0 调用 ExitProcess,因此可以省去多余的调用,让 MessageBoxA 的调用通过跳过标签直接进入 ExitProcess 调用。