1:FLD : FPU(浮点处理器)的加载浮点数到堆栈指令

.386
.model flat,stdcall.stack 4096
ExitProcess PROTO,dwExitCode:DWORD.data
array REAL8 10 DUP(?)
dblOne REAL8 234.56
dblTwo REAL8 10.1.code
main PROCfld array                      ;直接寻址fld [array+16]                 ;直接偏移mov esi,OFFSET arrayfld REAL8 PTR[esi]             ;间接寻址mov esi,1fld array[esi*8]                ;带比例因子的变址fld array[esi*TYPE array]       ;带比例因子的变址mov ebx,OFFSET arraymov esi,8fld REAL8 PTR[ebx+esi]          ;基址 - 变址mov ebx,3*TYPE array         fld array[ebx+esi]              ;基址 - 变址 - 偏移量(二维数组的访问方式)mov esi,1fld array[ebx+esi * TYPE array] ;带比例因子的基址 - 变址 - 偏移量fld dblOne        ;ST(0) = dblOnefld dblTwo        ;ST(0) = dblTwo,ST(1) = dblOneINVOKE ExitProcess,0
main ENDP
END main

2:FST_FSTP : FST伪指令将栈顶数据复制到内存,FSTP伪指令将栈顶数据复制到内存,并出栈

.386
.model flat,stdcall.stack 4096
ExitProcess PROTO,dwExitCode:DWORD.data
dblOne REAL8 234.56
dblTwo REAL8 10.1
dblThree REAL8 ?
dblFour REAL8 ?.code
main PROCfld dblOne  ;ST(0) = dblOnefld dblTwo  ;ST(0)= dblTwo,ST(1) = dblOne;将栈顶数据复制到内存fst dblThree  ;10.1fst dblFour   ;10.1;将栈顶数据复制到内存,并出栈fstp dblThree  ;10.1fstp dblFour   ;234.56INVOKE ExitProcess,0
main ENDP
END main

3:FCHS_FABS : FCHS伪指令将ST(0)中浮点值的符号取反,FABS伪指令将ST(0)中浮点值的符号去掉,以得到绝对值

.386
.model flat,stdcall.stack
ExitProcess PROTO,dwExitCode:DWORD.data
dblOne REAL4 1.23.code
main PROCfld dblOnefchs   ;将ST(0)中浮点值的符号取反fabs   ;将ST(0)中浮点值的符号去掉,以得到绝对值INVOKE ExitProcess,0
main ENDP
END main

4:FADD_FADDP_FIADD :浮点数据三种相加运算伪指令使用

.386
.model flat,stdcall.stack 4096
ExitProcess PROTO,dwExitCode:DWORD.data
dblOne REAL8 234.56
dblTwo REAL8 10.1
myInteger DWORD 1
.code
main PROCfld dblOnefld dblTwo;ST(1) 234.56   , ST(0)10.1fadd ;无操作数的用法 ST(0)与ST(1)相加,结果暂存在ST(1),然后ST(0)出栈,结果保存在栈顶;ST(0) 244.66fld dblTwo;ST(1) 244.66  ,ST(0)10.1fadd ST(1),ST(0)   ;寄存器操作数用法,将ST(0)加到ST(1);ST(1) 254.76  ,ST(0)10.1;内存操作数用法fadd dblTwo  ;ST(0) += dblTwo  mov esi,OFFSET dblTwofadd REAL8 PTR[esi] ;ST(0) += [esi];ST(1)254.76  ST(0)30.3faddp ST(1),ST(0)  ;ST(0)加到ST(1),然后ST(0)出栈 ;ST(0)285.06;先将源操作数转换为扩展双精度浮点点,fiadd myInteger  ;ST(0) += myIntegerINVOKE ExitProcess,0
main ENDP
END main

5:FSUB_FSUBP_FISUB : 浮点数据三种相减运算伪指令使用

.386
.model flat,stdcall.stack 4096
ExitProcess PROTO,dwExitCode:DWORD.data
dblOne REAL8 10.10
dblTwo REAL8 1.1
myInteger DWORD 1.code
main PROCfld dblOnefld dblTwo;无操作数用法,ST(1)减去ST(0),结果暂存ST(1),然后ST(0)弹出堆栈,将结果保留在栈顶fsub ;内存操作数用法,ST(0)减去内存操作数fsub dblTwo  ;ST(0) -= dblTwo;寄存器用法fsub ST(1),ST(0)  ;ST(1) -= ST(0) ,ST(0)不出栈;fsubp 指令,会将ST(0)出栈fld dblTwofsubp ST(1),ST(0)  ;ST(1) -= ST(0) ,然后ST(0)出栈;整数减法,先把源操作数转换为扩展双精度浮点数,再从ST(0)中减去该操作数FISUB myInteger  ;ST(0) -= myInteger INVOKE ExitProcess,0
main ENDP
END main

6:FMUL_FMULP_FIMUL : 浮点数据三种相乘运算伪指令使用

.386
.model flat,stdcall.stack 4096
ExitProcess PROTO,dwExitCode:DWORD.data
dblOne REAL8 10.10
dblTwo REAL8 1.1
myInteger DWORD 1.code
main PROCfld dblOnefld dblTwo;无操作数用法,ST(1)乘以ST(0),结果暂存ST(1),然后ST(0)弹出堆栈,将结果保留在栈顶fmul;内存操作数用法,ST(0)乘以内存操作数fmul dblTwo  ;ST(0) *= dblTwo;寄存器用法fmul ST(1),ST(0)  ;ST(1) *= ST(0) ,ST(0)不出栈;fmulp 指令,会将ST(0)出栈fld dblTwofmulp ST(1),ST(0)  ;ST(1) *= ST(0) ,然后ST(0)出栈;整数乘法,先把源操作数转换为扩展双精度浮点数,再从ST(0)中乘以该操作数fimul myInteger  ;ST(0) *= myInteger INVOKE ExitProcess,0
main ENDP
END main

7:FDIV_FDIVP_FIDIV : 浮点数据三种相除运算伪指令使用

.386
.model flat,stdcall.stack 4096
ExitProcess PROTO,dwExitCode:DWORD.data
dblOne REAL8 10.10
dblTwo REAL8 1.1
myInteger DWORD 1.code
main PROCfld dblOnefld dblTwo;无操作数用法,ST(1)除去ST(0),结果暂存ST(1),然后ST(0)弹出堆栈,将结果保留在栈顶fdiv ;内存操作数用法,ST(0)除去内存操作数fdiv dblTwo  ;ST(0) /= dblTwo;寄存器用法fdiv ST(1),ST(0)  ;ST(1) /= ST(0) ,ST(0)不出栈;fsubp 指令,会将ST(0)出栈fld dblTwofdivp ST(1),ST(0)  ;ST(1) /= ST(0) ,然后ST(0)出栈;整数除法,先把源操作数转换为扩展双精度浮点数,再从ST(0)中除去该操作数fidiv myInteger  ;ST(0) /= myInteger INVOKE ExitProcess,0
main ENDP
END main

8:FCOMP : 浮点数据比较伪指令FCOMP使用

.386
.model flat,stdcall.stack 4096
ExitProcess PROTO,dwExitCode:DWORD;比较如下C++代码
;double X = 1.2
;double Y = 3.0
;int N =0
;if (X < Y)
;  N= 1.data
X REAL8 1.2
Y REAL8 3.0
N DWORD 0;fcom   比较ST(0)与ST(1)
;fcom m32fp 比较ST(0) 与 m32fp
;fcom m32fp 比较ST(0) 与 m64fp
;fcom ST(i)  比较ST(0)与ST(i);fcomp 会将ST(0)出栈;fcompp 会出栈两次.code
main PROCfld X      ;ST(0) = Xfcomp Y    ;比较ST(0)和Y,ST(0)出栈fnstsw ax  ;状态字送入AXsahf       ;AH复制到EFLAGSjnb L1     ;X不小于Y ? 跳过mov N,1    ;N=1
L1:INVOKE ExitProcess,0
main ENDP
END main

9:FCOMI : 浮点数据比较伪指令FCOMI使用,因为浮点数比较的运行时开销大于整数比较, Intel P6系列引入了fcomi,比较浮点数值,并直接设置ZF,PF和CF

.386
.model flat,stdcall.stack 4096
ExitProcess PROTO,dwExitCode:DWORD.data
X REAL8 1.2
Y REAL8 3.0
N DWORD 0;fcomi 格式
;fcomi ST(0),ST(i).code
main PROCfld Y       ;ST(0) = Yfld X       ;ST(0) = X,ST(1) = Yfcomi ST(0),ST(1)  ;比较ST(0)和ST(1)jnb L1      ;ST(0)不小于ST(1)?跳过mov N,1     ;N =1
L1:INVOKE ExitProcess,0
main ENDP
END main

10:FCOMI_EQUAL : 比较浮点数相等的问题,因为浮点数在计算过程中会出现舍入误差,比较相等比较X与Y时,应该取它们的差值的 绝对值|x-y|,再与用户定义的误差值比较,只不大于误差值就认为两个浮点数相等

include Irvine32.inc
include Macros.inc
.data
epsilon REAL8 1.0E-12
val2 REAL8 0.0  ;比较的数值
val3 REAL8 1.001E-13  .code
main PROC;如果(val2 == val3),显示"Values are equal"fld epsilonfld val2fsub val3fabsfcomi ST(0),ST(1)ja skipmWrite <"Values are equal",0dh,0ah>
skip:INVOKE ExitProcess,0
main ENDP
END main

汇编语言-018(FLD 、FST、FSTP、FCHS、FABS 、浮点运算符、浮点比较 )相关推荐

  1. 汇编浮点指令fld、fstp

    FLD类似于   PUSH指令 FSTP类似于  POP指令 FADD类似于  ADD指令 1.FLD 指令格式: FLD STReg/MemReal 指令功能: 将浮点数据压入协处理器的堆栈中.当进 ...

  2. 软浮点硬浮点不配套问题(error:uses VFP register arguments)

    1.前言 报错信息: error:/home/xxx.a uses VFP register arguments, /home/xxx.a does not VFP(Virtual Float Poi ...

  3. mysql 字段 浮点_MySQL浮点数据字段不接受每个浮点数?如何解决这个问题?

    要获取固定的float数据类型,请使用DECIMAL().这将解决不接受的问题.让我们首先创建一个表-mysql> create table DemoTable(Amount DECIMAL(1 ...

  4. JAVA语言运算符有哪些?

    Java,是由Sun Microsystems公司于1995年5月推出的Java程序设计语言和Java平台的总称.用Java实现的HotJava浏览器(支持Java applet)显示了Java的魅力 ...

  5. 汇编 浮点指令FLD,FSTP,FADD与FPU寄存器

    知识点:  浮点数的存放方式  st0至st7  FLD,FST,FADD指令一.浮点数的存放方式 00401000 /$ 55 PUSH EBP 00401001 |. 8BEC MOV EB ...

  6. 汇编中浮点栈寄存器st0~st7浮点计算fld压栈再计算的过程运行原理

    目录 为什么浮点数不能用普通的数学指令计算 结论 用普通的数学计算add无法实现浮点数加法.必须使用浮点数计算指令fadd来进行浮点数加法计算. fpu的概念 浮点数计算需要先用fld指令压栈用fld ...

  7. 技术派-汇编语言之操作码和助记符(Intel系列)

    汇编语言之操作码和助记符(Intel系列)的十六进制操作码和助记符 00 ADD             01 ADD 02 ADD             03 ADD             04 ...

  8. 《汇编语言程序设计》——仿windows计算器

    <汇编语言程序设计> --计算器程序设计 目录 一.     题目与目标 1.      题目 2.      学习目的 二.     分析与设计 1.      系统分析 2.      ...

  9. 汇编语言,浮点运算指令

    协处理器指令系统 协处理器共有68条不同的指令,汇编程序在遇到协处理器指令助记符时,都会将其转换成机器语言的ESC指令,ESC指令代表了协处理器的操作码. 协处理器指令在执行过程中,需要访问内存单元时 ...

最新文章

  1. Eclipse启动之二:Eclipse动态库(百度空间迁移)
  2. Kafka压力测试(写入MQ消息压测和消费MQ消息压测)
  3. python 调用c++回调char*
  4. linux cmake编译源码,linux安装mysql(源码)以及cmake编译
  5. 使用帆软finereport实现跳转的一点心得
  6. 北京内推 | 腾讯云小微自然语言技术中心招聘NLP研究型实习生
  7. 【建议收藏】数据中心服务器基础知识大全
  8. 数据 3 分钟 | 《数据安全法》即将施行;ACM SIGMOD在西安举办;艾瑞咨询发布数据库行业报告...
  9. 利用泛型写一个简单的链表
  10. 【CCCC】L3-023 计算图 (30分),dfs搜索+偏导数计算
  11. 通过ajax实现简单的数据交互(模板引擎)
  12. Verilog初级教程(8)Verilog中的assign语句
  13. 助航标志信息自动导入电子海图研究
  14. 拉线自动行走机器人_架空输电线路自动巡线机器人
  15. linux下的定时任务
  16. java狼羊草过河_解决狼、羊、白菜过河问题的编程思路
  17. 高校教室多媒体设备报修管理系统
  18. 程序员公司实行996,加班费却只有10块!网友:我们20块
  19. LINUX磁盘分区和添加磁盘的一些命令
  20. 解决win11/win10在登陆界面(解锁界面)点击获取每日壁纸无效的问题 - get Daily Lockscreen and Wallpaper - Win11/10的登录界面背景图片在哪里?

热门文章

  1. linux 查看libusb版本,linux / libusb获取usb设备路径
  2. 从零开始学习前端开发 — 7、CSS宽高自适应
  3. 一篇文章为你深度解析HTTPS 协议
  4. scss-!optional
  5. 送福利:ROKID 语音开发板免费送,开启你的物联网之旅
  6. 更安全的Web通信HTTPS
  7. html5中如何去掉input type date默认
  8. 阅读react-redux源码(三) - mapStateToPropsFactories、mapDispatchToPropsFactories和mergePropsFactories
  9. luoguP4551最长异或路径
  10. 生产上完成TopN统计流程