代码执行条件错误?

til*_*waa 2 x86 assembly if-statement x86-16

基本问题在这里,

我写了以下块:

    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
Run Code Online (Sandbox Code Playgroud)

我是装配新手。

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

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

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

Mik*_*kis 5

啊,Turbo Assembler“理想”模式;自从我上次看到它以来已经有一段时间了。我喜欢理想模式。它比 Microsoft Assembler 的语法经过深思熟虑并且更有意义。

嗯,发生的情况是两条指令都被执行了。

首先,mov ax, 0执行,然后控制权转到下一条语句,即mov ax, 1,所以剩下的 inax1

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

所以,你需要的是:

    ...
    cmp al, [Var2]
    jg  Var1Greater
    mov ax, 0
    jmp skip
Var1Greater:
    mov ax, 1
skip:
Run Code Online (Sandbox Code Playgroud)

此外,在编写汇编语言时使用xor ax, ax而不是mov ax, 0.

  • 我可以添加的唯一脚注是,不清楚 OP 是否知道“jg”(跳转更大)是有符号比较,而“ja”(跳转到上方)是无符号比较。使用“jg”,如果您使 Var1=128 和 Var2=127,如果它们假设无符号字节,则它们将不会得到预期的答案。 (2认同)