【问题标题】:Code executes condition wrong?代码执行条件错误?
【发布时间】:2015-09-30 17:43:33
【问题描述】:

这里是基本问题,

我写了以下代码块:

    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。

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

【问题讨论】:

    标签: loops assembly x86 x86-16


    【解决方案1】:

    啊,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 是一种很好的形式。

    【讨论】:

    • 嘿,迈克,我知道会发生这种情况。但是,由于“JG”的条件不满足,使代码在“Var1Greater”块上跳过的正确方法是什么?
    • 嗯,user4419802 比我快,他已经给出了答案。
    • user4419802 的回答是正确的。但是,如果它不符合您的目的,那我能说什么,我用稍微不同的方法修改了我的答案。
    • 啊,你是对的,OP 在这方面确实改变了一些问题。您的编辑现在匹配。所以一切都很好。我投了赞成票。
    • 我可以添加到这一切的唯一脚注是,不清楚 OP 是否知道 jg(跳转更大)是有符号比较,ja(跳转到上面)是无符号比较.使用jg,如果您设置 Var1=128 和 Var2=127,如果他们假设无符号字节,他们将不会得到预期的答案。
    【解决方案2】:

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

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

    【讨论】:

    • 但如果我这样做mov ax, 1,ax = 3。这不是我试图在代码中得到的。
    • @tilikompowaa mov 不会更改flags 寄存器,因此将它放在cmp 和jg 之间是安全的。
    • 但如果 a=3 仍然会执行 skip0。我在这里很困惑。我只是想创建一个简单的“如果”条件。
    • @tilikompowaa skip0: 不是指令。它只是一个标签,是在整个“pseudo-if-operator”完成之后恢复执行的点。
    • 我已更改代码以更准确地说明我的问题。请检查。
    猜你喜欢
    • 2016-06-14
    • 2013-07-07
    • 2011-08-25
    • 1970-01-01
    • 2013-05-17
    • 1970-01-01
    • 1970-01-01
    • 2017-05-13
    相关资源
    最近更新 更多