如果不相等则跳跃即使在相等时仍然跳跃

时间:2015-04-20 23:17:57

标签: winapi assembly

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,所以它为什么跳到标签&打电话给消息框?它正在这样做。

Jose的工作解决方案:

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  

4 个答案:

答案 0 :(得分:5)

他告诉你要使用更简单的方法。将标签移到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

由于你以任何一种方式调用ExitProcess,代码为0,你可以省去冗余调用,让MessageBoxA的调用通过你的跳过标签直接进入ExitProcess调用。

答案 1 :(得分:3)

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

答案 2 :(得分:3)

我有一段时间没有对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

正如您所看到的,简化版本少了一行,因此更可取。

答案 3 :(得分:0)

如果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: