Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/heroku/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Loops 代码执行条件错误?_Loops_Assembly_X86_X86 16 - Fatal编程技术网

Loops 代码执行条件错误?

Loops 代码执行条件错误?,loops,assembly,x86,x86-16,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 Var1Grea

基本问题在这里,

我写了以下代码块:

    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]的代码

如果(!)[Var1]大于[Var2],则执行
mov ax,1
。如果(1)任何其他(等于或小于)异常,
mov ax,0

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

啊,Turbo汇编程序的“理想”模式;我已经有一段时间没有看到它了。我喜欢理想模式。它比微软汇编程序的语法考虑得好得多,也更有意义

好的,现在发生的是两个指令都得到执行

首先执行
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:

嘿,迈克,我知道会发生这种事。但是,由于“JG”的条件不满足,让代码跳过“Var1Greater”块的正确方法是什么呢?嗯,user4419802比我快,他已经给出了答案。user4419802的答案是正确的。但是如果它不符合你的目的,那么我能说什么呢,我用了一种稍微不同的方法修改了我的答案。啊,你是对的,OP确实在这方面改变了问题。您的编辑现在匹配。所以一切都很好。我向上投了一票。我唯一可以补充的一点是,OP是否知道
jg
(跳转更大)是有符号比较,而
ja
(跳转上方)是无符号比较,这一点尚不清楚。使用
jg
如果将Var1=128和Var2=127设为无符号字节,则它们不会得到预期的结果。但是如果我设为
mov ax,1
,ax=3。这不是我试图在代码中得到的。@tilikompowaa
mov
不会更改
标志
寄存器,因此可以安全地将其放在
cmp
jg
之间。但是如果a=3,那么skip0将执行。我在这里很困惑。我只是想创建一个简单的“如果”条件。@tilikompowaa
skip0:
不是指令。这只是一个标签,在整个“伪if操作符”完成后,执行将继续。我已经更改了代码,以便更准确地回答我的问题。请查收。