我有一个很大的问题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!!! 这怎么可能??我试过交换变量而没有!你能帮助我吗??=(
我有一个繁重的数字运算程序,可以进行图像处理.它主要是卷积.它是用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倍的加速.我错了吗?
这是一小段汇编代码(我使用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) 我可以选择以下 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 有区别吗?
这是我的短装配程序:
; 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()然后调用它.没什么复杂的.
更新:我认为我修复了这个问题还为时过早.我已经更新了代码.
我试图了解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,否则程序会崩溃。但是通过这样做,我更改了“常规堆栈”的指针,这与我关于两个独立堆栈的想法没有任何意义。
我确定我不了解某些内容,但是我不知道这是什么。