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
答案 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: