汇编语言-018(FLD 、FST、FSTP、FCHS、FABS 、浮点运算符、浮点比较 )
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 、浮点运算符、浮点比较 )相关推荐
- 汇编浮点指令fld、fstp
FLD类似于 PUSH指令 FSTP类似于 POP指令 FADD类似于 ADD指令 1.FLD 指令格式: FLD STReg/MemReal 指令功能: 将浮点数据压入协处理器的堆栈中.当进 ...
- 软浮点硬浮点不配套问题(error:uses VFP register arguments)
1.前言 报错信息: error:/home/xxx.a uses VFP register arguments, /home/xxx.a does not VFP(Virtual Float Poi ...
- mysql 字段 浮点_MySQL浮点数据字段不接受每个浮点数?如何解决这个问题?
要获取固定的float数据类型,请使用DECIMAL().这将解决不接受的问题.让我们首先创建一个表-mysql> create table DemoTable(Amount DECIMAL(1 ...
- JAVA语言运算符有哪些?
Java,是由Sun Microsystems公司于1995年5月推出的Java程序设计语言和Java平台的总称.用Java实现的HotJava浏览器(支持Java applet)显示了Java的魅力 ...
- 汇编 浮点指令FLD,FSTP,FADD与FPU寄存器
知识点: 浮点数的存放方式 st0至st7 FLD,FST,FADD指令一.浮点数的存放方式 00401000 /$ 55 PUSH EBP 00401001 |. 8BEC MOV EB ...
- 汇编中浮点栈寄存器st0~st7浮点计算fld压栈再计算的过程运行原理
目录 为什么浮点数不能用普通的数学指令计算 结论 用普通的数学计算add无法实现浮点数加法.必须使用浮点数计算指令fadd来进行浮点数加法计算. fpu的概念 浮点数计算需要先用fld指令压栈用fld ...
- 技术派-汇编语言之操作码和助记符(Intel系列)
汇编语言之操作码和助记符(Intel系列)的十六进制操作码和助记符 00 ADD 01 ADD 02 ADD 03 ADD 04 ...
- 《汇编语言程序设计》——仿windows计算器
<汇编语言程序设计> --计算器程序设计 目录 一. 题目与目标 1. 题目 2. 学习目的 二. 分析与设计 1. 系统分析 2. ...
- 汇编语言,浮点运算指令
协处理器指令系统 协处理器共有68条不同的指令,汇编程序在遇到协处理器指令助记符时,都会将其转换成机器语言的ESC指令,ESC指令代表了协处理器的操作码. 协处理器指令在执行过程中,需要访问内存单元时 ...
最新文章
- Eclipse启动之二:Eclipse动态库(百度空间迁移)
- Kafka压力测试(写入MQ消息压测和消费MQ消息压测)
- python 调用c++回调char*
- linux cmake编译源码,linux安装mysql(源码)以及cmake编译
- 使用帆软finereport实现跳转的一点心得
- 北京内推 | 腾讯云小微自然语言技术中心招聘NLP研究型实习生
- 【建议收藏】数据中心服务器基础知识大全
- 数据 3 分钟 | 《数据安全法》即将施行;ACM SIGMOD在西安举办;艾瑞咨询发布数据库行业报告...
- 利用泛型写一个简单的链表
- 【CCCC】L3-023 计算图 (30分),dfs搜索+偏导数计算
- 通过ajax实现简单的数据交互(模板引擎)
- Verilog初级教程(8)Verilog中的assign语句
- 助航标志信息自动导入电子海图研究
- 拉线自动行走机器人_架空输电线路自动巡线机器人
- linux下的定时任务
- java狼羊草过河_解决狼、羊、白菜过河问题的编程思路
- 高校教室多媒体设备报修管理系统
- 程序员公司实行996,加班费却只有10块!网友:我们20块
- LINUX磁盘分区和添加磁盘的一些命令
- 解决win11/win10在登陆界面(解锁界面)点击获取每日壁纸无效的问题 - get Daily Lockscreen and Wallpaper - Win11/10的登录界面背景图片在哪里?
热门文章
- linux 查看libusb版本,linux / libusb获取usb设备路径
- 从零开始学习前端开发 — 7、CSS宽高自适应
- 一篇文章为你深度解析HTTPS 协议
- scss-!optional
- 送福利:ROKID 语音开发板免费送,开启你的物联网之旅
- 更安全的Web通信HTTPS
- html5中如何去掉input type date默认
- 阅读react-redux源码(三) - mapStateToPropsFactories、mapDispatchToPropsFactories和mergePropsFactories
- luoguP4551最长异或路径
- 生产上完成TopN统计流程