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。这不是我试图在代码中得到的。@tilikompowaamov
不会更改标志
寄存器,因此可以安全地将其放在cmp
和jg
之间。但是如果a=3,那么skip0将执行。我在这里很困惑。我只是想创建一个简单的“如果”条件。@tilikompowaaskip0:
不是指令。这只是一个标签,在整个“伪if操作符”完成后,执行将继续。我已经更改了代码,以便更准确地回答我的问题。请查收。