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 调用。
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 调用。