看着SSE运营商
CMPORDPS - ordered compare packed singles
CMPUNORDPS - unordered compare packed singles
Run Code Online (Sandbox Code Playgroud)
有序和无序是什么意思?我在x86指令集中寻找等效指令,它似乎只有无序(FUCOM).
我的任务是在混合C/ASM中编写一个简单的应用程序,它必须使用数学协处理器.
有一个函数柱面(float x,float y,float z),如果给定的点位于柱面内,则返回1(柱面的底边为x = 0,y = 0,半径= 5,高度= 10),如果不是,则为0.
所以,看起来很简单.检查z是否在<0,10>范围内,然后检查x ^ 2 + y ^ 2 <25.
但是我对x87的了解是零.
这就是我写的一切.
_cylinder PROC
push ebp
mov ebp, esp
sub esp,8 ; I can't use .data in the application, so I reserve some space on the stack for numbers 10 and 25
mov [esp],10
mov [esp+4],25
finit
fldz
fld [ebp+8]
;here i get stuck
add esp, 8
pop ebp
_cylinder ENDP
Run Code Online (Sandbox Code Playgroud)
所以我卡住了.所以,我试着找到我可以在应用程序中使用的指令.在那里我卡住了,因为我在网上找到的每个教程/指令列表写得非常糟糕,我几乎无法理解任何东西.
问题是,当我从数学协处理器弹出一些东西时会发生什么?我在哪里可以找到弹出值?它如何从80位值转换为32位值(当然如果有)另一个问题是,FCOM(用于pop变体的FCOMP)如何工作?它比较什么(st0到st1或st1到st0?),在哪里可以看到值是小/等于/更大?
谢谢你的帮助!
在C(C99之前)中,布尔值通常表示为
typedef int bool;
#define true 1
#define false 0
Run Code Online (Sandbox Code Playgroud)
为什么它被表示为'int'而不是'float'?
这是一个面试问题,即使我想知道为什么要问这样的问题!任何有说服力的答案?
我正在尝试使用8086处理器编写汇编程序,该处理器将找到数字的立方根.显然我使用的是浮点数.
root := 1.0;
repeat
oldRoot := root;
root := (2.0*root + x/(root*root)) / 3.0
until ( |root – oldRoot| < 0.001;
Run Code Online (Sandbox Code Playgroud)
如何将(2*root + x)除以(root*root)?
.586
.MODEL FLAT
.STACK 4096
.DATA
root REAL4 1.0
oldRoot REAL4 2.0
Two REAL4 2.0
inttwo DWORD 2
itThree DWORD 3
three REAL4 3.0
x DOWRD 27
.CODE
main PROC
finit ; initialize FPU
fld root ; root in ST
fmul two ; root*two
fadd x ; root*two+27
fld root ; root …Run Code Online (Sandbox Code Playgroud) 英特尔指令参考中提供了以下文档以供参考COMISD:
在操作数1(第一个操作数)的低四字比较双精度浮点值和操作数2(第二个操作数),并设定了
ZF,PF和CF在EFLAGS标志寄存器根据结果(无序,大于,小于大于或等于)。
的CF的标志点是不是真的在这里清除,因为它关系到算术运算的无符号整数。相反,文档关注的是按定义签名的浮点。我进行了一些实验,例如
mov rax, 0x123
movq xmm0, rax
mov rax, 0x124
movq xmm1, rax
ucomisd xmm0, xmm1 ;CF is set here like if
;we would compare uints 0x123 and 0x124
Run Code Online (Sandbox Code Playgroud)
因此,当将操作数设置为双精度浮点时,该指令会将操作数设置为进位标志时,会将操作数视为无符号整数?
在我看来,这有点奇怪。
我刚刚开始使用32位汇编,我很困惑。我有以下代码:
.586
.MODEL FLAT
.STACK 4096
.DATA
.CODE
main PROC
finit
fldpi
fld1
fcom
fstsw ax
sahf
JL jumper
nop
jumper:
nop
nop
main ENDP
END
Run Code Online (Sandbox Code Playgroud)
现在,据我了解,我将pi压入堆栈,然后将1压入堆栈,它应该比较pi和1并看到1较小,然后执行跳转。但是,比较似乎不起作用。有人可以帮忙吗?