代码执行条件错误?

Code executes condition wrong?

这里是基本问题,

我写了以下块:

    IDEAL
    MODEL small
    STACK 100h
    DATASEG

    Var1 db 4
    Var2 db 2

    CODESEG

start:
    mov ax, @data
    mov ds, ax
    xor ax, ax
    mov al, [Var1]
    cmp al, [Var2]
    jg  Var1Greater
    mov ax, 1
Var1Greater:
    mov ax, 0

我是装配新手。

我想创建一个代码来比较 [Var1] 和 [Var2]。

IF(!) [Var1] 大于 [Var2],执行 mov ax, 1。 IF(1) 任何其他(等于或小于)执行,mov ax, 0.

如何做到这一点?如果条件为真,我编写的代码将执行两条指令。

啊,Turbo 汇编程序 "Ideal" 模式;自从我上次看到它已经有一段时间了。我喜欢理想模式。它经过深思熟虑,比 Microsoft Assembler 的语法更有意义。

好吧,发生的事情是两个指令都被执行了。

首先,mov ax, 0 被执行,然后控制权落到下一条语句,即 mov ax, 1,所以你在 ax 中剩下的是 1.

汇编语言中的标签不会神奇地导致控制跳转到别处。它们不会导致汇编程序发出任何指令。它们的存在只是为了让您可以指示另一个跳转指令的目标。

那么,你需要的是:

    ...
    cmp al, [Var2]
    jg  Var1Greater
    mov ax, 0
    jmp skip
Var1Greater:
    mov ax, 1
skip:

此外,在编写汇编语言时使用 xor ax, ax 代替 mov ax, 0 是一种很好的形式。

你也必须跳过Var1Greater才能跳过mov ax, 1指令。作为替代方案,您可以这样做:

mov ax, [Var1]
cmp ax, [Var2]
mov ax, 1
jg  skip0
mov ax, 0
skip0: