标签: x87

师8086/8087 1/3 = 3?

我有一个很大的问题fdiv!!!! 我试图划分1/3所以这就是我所做的

.model small
.stack 100h 
.data 

var1 dd 1
var2 dd 3 
var3 dd 2
resultado dt 0.0

.code 

mov ax,@data 
mov ds,ax 
finit 
fild var1
fild var2
fdiv
fstp resultado
ffree 

.exit 
Run Code Online (Sandbox Code Playgroud)

你可以看到我将结果移动到resultado因为我看不到结果st(0)(我正在使用tasm所以我只能在调试器中看到变量)结果应该是3EAAAA3A但我得到了40400000...那就是3!!! 这怎么可能??我试过交换变量而没有!你能帮助我吗??=(

x86 assembly fpu tasm x87

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

SSE没有为C++数字运算提供加速

我有一个繁重的数字运算程序,可以进行图像处理.它主要是卷积.它是用C++编写的,用Mingw GCC 4.8.1编译.我在配备Intel Core i7 4900MQ(SSE高达SSE4.2和AVX2)的笔记本电脑上运行它.

当我告诉GCC使用SSE优化(使用-march = native -mfpmath = sse -msse2)时,与使用默认的x87 FPU相比,我看不到加速.

当我使用双打而不是浮动时,没有减速.

我的理解是,当使用浮动而不是双重时,SSE应该给我2倍的加速.我错了吗?

c++ gcc sse x87

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

为什么在使用浮点指令(fldl&fstpl)推送它时,使用两个32位的推送在堆栈上推双倍?

这是一小段汇编代码(我使用gnu汇编程序的语法).

.extern cos
.section .data
pi: .double 3.14
.section .text
.global slowcos
.global fastcos

fastcos:
  fldl pi         
  subl $8, %esp   # makes some space for a double on the stack
  fstpl 0(%esp)   # copy pi on top of the stack
  call cos
  addl $8, %esp
  ret

slowcos:
  pushl pi+4      # push the last 4 bytes of pi on top of the stack
  pushl pi        # push the first 4 bytes of pi on top of the stack
  call cos
  addl …
Run Code Online (Sandbox Code Playgroud)

floating-point double assembly 32-bit x87

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

使用 dword 或 qword 参数时 fdiv 更快吗?

我可以选择以下 80387 指令:

fdiv dword ptr a
Run Code Online (Sandbox Code Playgroud)

fdiv qword ptr b
Run Code Online (Sandbox Code Playgroud)

a和 的数字b是等价的,都是 100% 准确的。

我应该选择该版本有理由吗qword?我只能将速度视为一个好处。现代处理器有区别吗?80387 和 80487 有区别吗?

floating-point x86 assembly cpu-architecture x87

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

为什么这个简单的程序会输出这么多字符?

这是我的装配程序:

; This code has been generated by the 7Basic
; compiler <http://launchpad.net/7basic>

extern printf

; Initialized data

      SECTION .data
f_0 dd 5.5
printf_f: db "%f",10,0

      SECTION .text

; Code

global main
  main:
push ebp
mov ebp,esp

push dword [f_0]
push printf_f
call printf
add esp,8

mov esp,ebp
pop ebp
mov eax,0
ret
Run Code Online (Sandbox Code Playgroud)

该程序应该做的是打印5.5,但它打印:

-4101885043414705786563701568963176764603483495211119243453355953219830430011006780068899468997203661787555969981250050126586203424320244681571103387315766489883301796219461838644670607029711305942610787622864198879363376953745160639821663444829839767678538571371627347101810056161000273217639447052410683392.000000

我究竟做错了什么?代码将两个参数推送到printf()然后调用它.没什么复杂的.


更新:我认为我修复了这个问题还为时过早.我已经更新了代码.

x86 assembly printf x87

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

组装x86 FPU-堆栈混乱

我试图了解FPU,但我很困惑。问题是,当我从了解这里,FPU都有自己的堆栈。但例如在以下代码(NASM)中:

global _main

extern _printf

section .data
    hellomessage db `Hello World!\n`, 10, 0
    numone dd 1.2
    digitsign db '%f', 0xA, 0

section .text
_main:
    ;Greet the user
    push hellomessage
    call _printf
    add esp,4

    sub esp, 8

    fld dword[numone]
    fstp qword[esp]

    push digitsign
    call _printf
    add esp, 12
    ret
Run Code Online (Sandbox Code Playgroud)

我必须要sub esp, 8为“腾出空间”的行double,否则程序会崩溃。但是通过这样做,我更改了“常规堆栈”的指针,这与我关于两个独立堆栈的想法没有任何意义。

我确定我不了解某些内容,但是我不知道这是什么。

x86 assembly nasm cpu-registers x87

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

标签 统计

x87 ×6

assembly ×5

x86 ×4

floating-point ×2

32-bit ×1

c++ ×1

cpu-architecture ×1

cpu-registers ×1

double ×1

fpu ×1

gcc ×1

nasm ×1

printf ×1

sse ×1

tasm ×1