相关疑难解决方法(0)

有序/无序比较是什么意思?

看着SSE运营商

CMPORDPS - ordered compare packed singles
CMPUNORDPS - unordered compare packed singles
Run Code Online (Sandbox Code Playgroud)

有序和无序是什么意思?我在x86指令集中寻找等效指令,它似乎只有无序(FUCOM).

x86 assembly sse

33
推荐指数
3
解决办法
1万
查看次数

x87 FPOP和FCOM指令 - 这些如何工作?

我的任务是在混合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 x86 assembly x87

5
推荐指数
1
解决办法
1630
查看次数

为什么没有使用float表示bool?

在C(C99之前)中,布尔值通常表示为

typedef int bool;
#define true 1
#define false 0
Run Code Online (Sandbox Code Playgroud)

为什么它被表示为'int'而不是'float'?

这是一个面试问题,即使我想知道为什么要问这样的问题!任何有说服力的答案?

c types boolean

3
推荐指数
1
解决办法
1439
查看次数

使用Newton-Raphson方法在x87 FPU上的立方根

我正在尝试使用8086处理器编写汇编程序,该处理器将找到数字的立方根.显然我使用的是浮点数.

基于Newton-Raphson方法的算法:

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)

x86 assembly masm newtons-method x87

3
推荐指数
1
解决办法
643
查看次数

为什么x86 FP像无符号整数那样比较集CF,而不使用有符号条件?

英特尔指令参考中提供了以下文档以供参考COMISD

在操作数1(第一个操作数)的低四字比较双精度浮点值和操作数2(第二个操作数),并设定了ZFPFCF在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)

因此,当将操作数设置为双精度浮点时,该指令会将操作数设置为进位标志时,会将操作数视为无符号整数?

在我看来,这有点奇怪。

x86 assembly sse sse2 x87

3
推荐指数
1
解决办法
104
查看次数

FCOM浮点比较失败

我刚刚开始使用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较小,然后执行跳转。但是,比较似乎不起作用。有人可以帮忙吗?

x86 assembly x87

1
推荐指数
1
解决办法
665
查看次数

标签 统计

assembly ×5

x86 ×5

x87 ×4

c ×2

sse ×2

boolean ×1

masm ×1

newtons-method ×1

sse2 ×1

types ×1