代码执行条件错误?

时间:2015-09-30 17:43:33

标签: loops assembly x86 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

我是集会的新手。

我想创建一个将[Var1]与[Var2]进行比较的代码。

IF(!)[Var1]大于[Var2],执行mov ax, 1。如果(1)其他任何事物(等于或少于),则mov ax, 0

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

2 个答案:

答案 0 :(得分:3)

啊,Turbo Assembler“理想”模式;自从我上次看到它以来已经有一段时间了。我喜欢理想模式。这是一个更好的思考,它比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时,这是一种很好的形式。

答案 1 :(得分:2)

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

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