试图将 if-else 条件转换为程序集?
Trying to convert if-else conditional to Assembly?
如何将其转换为汇编语言?
if((w == x)&&(x == y)&&(y == z)&&(z == w)) 用一系列 cmp 和 jmp 命令转换成 HLA 形式?
到目前为止我的命令是:
program same;
#include("stdlib.hhf");
procedure theSame(w:int16; x:int16; y:int16; z:int16); @nodisplay; @noframe;
begin theSame;
*if((w == x)&&(x == y)&&(y == z)&&(z == w))*
mov(1, AL);
stdout.put("Same.", nl);
else
mov(0, AL);
stdout.put("Not the same", nl);
endif;
stdout.put("AL: ", (type int16 AL), nl);
end theSame;
begin sameOrnot;
stdout.put("Feed Me W: ");
stdin.get(w);
stdout.put("Feed Me X: ");
stdin.get(x);
stdout.put("Feed Me Y: ");
stdin.get(y);
stdout.put("Feed Me Z: ");
stdin.get(z);
theSame(w, x, y, z);
end sameOrnot;
if((w == x)&&(x == y)&&(y == z)&&(z == w))
与按位运算符 & 不同,&& 保证从左到右求值。因此,如果 (w == x)
评估为 false,则不需要进一步评估
mov ax, w ; (w == x)
cmp ax, x
jne IsFalse
mov ax, x ; &&(x == y)
cmp ax, y
jne IsFalse
mov ax, y ; &&(y == z)
cmp ax, z
jne IsFalse
mov ax, z ; &&(z == w)
cmp ax, w
jne IsFalse
IsTrue:
...
IsFalse:
...
&&(z == w)
部分是多余的!由于保证从左到右的评估,当我们到达第 4 部分时,我们已经知道 w EQ x EQ y EQ z
。结合性决定 w EQ z
.
我们也可以避免重新加载 AX
寄存器,因为我们从前面的每个步骤中获得了相等性。
mov ax, w ; (w == x)
cmp ax, x
jne IsFalse
; AX already holds the value for x (same as w)
cmp ax, y ; &&(x == y)
jne IsFalse
; AX already holds the value for y (same as w)
cmp ax, z ; &&(y == z)
jne IsFalse
IsTrue:
...
IsFalse:
...
如何将其转换为汇编语言? if((w == x)&&(x == y)&&(y == z)&&(z == w)) 用一系列 cmp 和 jmp 命令转换成 HLA 形式?
到目前为止我的命令是:
program same;
#include("stdlib.hhf");
procedure theSame(w:int16; x:int16; y:int16; z:int16); @nodisplay; @noframe;
begin theSame;
*if((w == x)&&(x == y)&&(y == z)&&(z == w))*
mov(1, AL);
stdout.put("Same.", nl);
else
mov(0, AL);
stdout.put("Not the same", nl);
endif;
stdout.put("AL: ", (type int16 AL), nl);
end theSame;
begin sameOrnot;
stdout.put("Feed Me W: ");
stdin.get(w);
stdout.put("Feed Me X: ");
stdin.get(x);
stdout.put("Feed Me Y: ");
stdin.get(y);
stdout.put("Feed Me Z: ");
stdin.get(z);
theSame(w, x, y, z);
end sameOrnot;
if((w == x)&&(x == y)&&(y == z)&&(z == w))
与按位运算符 & 不同,&& 保证从左到右求值。因此,如果 (w == x)
评估为 false,则不需要进一步评估
mov ax, w ; (w == x)
cmp ax, x
jne IsFalse
mov ax, x ; &&(x == y)
cmp ax, y
jne IsFalse
mov ax, y ; &&(y == z)
cmp ax, z
jne IsFalse
mov ax, z ; &&(z == w)
cmp ax, w
jne IsFalse
IsTrue:
...
IsFalse:
...
&&(z == w)
部分是多余的!由于保证从左到右的评估,当我们到达第 4 部分时,我们已经知道 w EQ x EQ y EQ z
。结合性决定 w EQ z
.
我们也可以避免重新加载 AX
寄存器,因为我们从前面的每个步骤中获得了相等性。
mov ax, w ; (w == x)
cmp ax, x
jne IsFalse
; AX already holds the value for x (same as w)
cmp ax, y ; &&(x == y)
jne IsFalse
; AX already holds the value for y (same as w)
cmp ax, z ; &&(y == z)
jne IsFalse
IsTrue:
...
IsFalse:
...