x86:条件、跳转和标签的组合
x86: Combination of conditions, jumps and labels
我在解释以下代码时遇到了困难。为了简单起见,我将一些从数据段中读取的数字替换为直接数字:
L1:
fld qword ptr [Data1]
fcomp 1.0
fnstsw ax
test ah, 01h
jz L2
fld qword ptr [Data2]
jmp L3
L2:
cmp word ptr [Data3], 0001h
jnz L4
fld qword ptr [Data4]
L3:
fstp qword ptr [esp+10h]
L4:
fld qword ptr [Data5]
fcomp 1.0
fnstsw ax
test ah, 01h
jz L5
mov qword ptr [Data6], 43.0
L5:
fld qword ptr [Data7]
fcomp 1.0
fnstsw ax
test ah, 01h
jz L6
mov qword ptr [Data7], 53.2
L6:
这是我对这段代码的解释:
double Data1
double Data2
int Data3
double Data4
double Data5
double Data6
double Data7
if Data1<=1.0 || Data3==1
if Data1<=1.0
*(esp+10h)= Data4;
else
*(esp+10h)= Data2;
end
end
if Data5<=1.0
Data6=43.0;
end
if Data7 <= 1.0
Data7=53.2;
end
我有两个顾虑:
我解释的代码正确吗?
在 L1
到 L4
之间的范围内有两个比较,但是在我的高级代码中,我有 3 个比较,但我不能将其减少为两个比较?原代码已经在high/mid级代码。我没有关于原始代码语言或编译器的信息。
你的某些条件有误。在 fcom
之后,如果 st0
严格小于操作数(或者比较无序),则设置 C0
标志(最终在 AH
中的位 #0)。
if Data1 < 1.0
*(esp+10h)= Data2;
else if Data3 == 1
*(esp+10h)= Data4;
end
if Data5 < 1.0
Data6=43.0;
end
if Data7 < 1.0
Data7=53.2;
end
我在解释以下代码时遇到了困难。为了简单起见,我将一些从数据段中读取的数字替换为直接数字:
L1:
fld qword ptr [Data1]
fcomp 1.0
fnstsw ax
test ah, 01h
jz L2
fld qword ptr [Data2]
jmp L3
L2:
cmp word ptr [Data3], 0001h
jnz L4
fld qword ptr [Data4]
L3:
fstp qword ptr [esp+10h]
L4:
fld qword ptr [Data5]
fcomp 1.0
fnstsw ax
test ah, 01h
jz L5
mov qword ptr [Data6], 43.0
L5:
fld qword ptr [Data7]
fcomp 1.0
fnstsw ax
test ah, 01h
jz L6
mov qword ptr [Data7], 53.2
L6:
这是我对这段代码的解释:
double Data1
double Data2
int Data3
double Data4
double Data5
double Data6
double Data7
if Data1<=1.0 || Data3==1
if Data1<=1.0
*(esp+10h)= Data4;
else
*(esp+10h)= Data2;
end
end
if Data5<=1.0
Data6=43.0;
end
if Data7 <= 1.0
Data7=53.2;
end
我有两个顾虑:
我解释的代码正确吗?
在
L1
到L4
之间的范围内有两个比较,但是在我的高级代码中,我有 3 个比较,但我不能将其减少为两个比较?原代码已经在high/mid级代码。我没有关于原始代码语言或编译器的信息。
你的某些条件有误。在 fcom
之后,如果 st0
严格小于操作数(或者比较无序),则设置 C0
标志(最终在 AH
中的位 #0)。
if Data1 < 1.0
*(esp+10h)= Data2;
else if Data3 == 1
*(esp+10h)= Data4;
end
if Data5 < 1.0
Data6=43.0;
end
if Data7 < 1.0
Data7=53.2;
end