gnu c 内联汇编 浮点数怎么操作

THFG 2013-11-05 10:00:58
如题。在gun下的c的内联汇编怎么进行浮点数操作,比如说怎么把两个浮点数相加。我看了一些关于汇编的书上说有fadd等这些专门操作浮点数的指令但是我用了编译不了。。求指教。。
...全文
235 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
赵4老师 2013-11-08
  • 打赏
  • 举报
回复
========== 浮点运算指令集 ======================================================
---------- 一、控制指令(带9B的控制指令前缀F变为FN时浮点不检查,机器码去掉9B)----
FINIT                 初始化浮点部件                   机器码  9B DB E3
FCLEX                 清除异常                         机器码  9B DB E2
FDISI                 浮点检查禁止中断                 机器码  9B DB E1
FENI                  浮点检查禁止中断二               机器码  9B DB E0
WAIT                  同步CPU和FPU                     机器码  9B
FWAIT                 同步CPU和FPU                     机器码  D9 D0
FNOP                  无操作                           机器码  DA E9
FXCH                  交换ST(0)和ST(1)                 机器码  D9 C9
FXCH ST(i)            交换ST(0)和ST(i)                 机器码  D9 C1iii
FSTSW ax              状态字到ax                       机器码  9B DF E0
FSTSW   word ptr mem  状态字到mem                      机器码  9B DD mm111mmm
FLDCW   word ptr mem  mem到状态字                      机器码  D9 mm101mmm
FSTCW   word ptr mem  控制字到mem                      机器码  9B D9 mm111mmm

FLDENV  word ptr mem  mem到全环境                      机器码  D9 mm100mmm
FSTENV  word ptr mem  全环境到mem                      机器码  9B D9 mm110mmm
FRSTOR  word ptr mem  mem到FPU状态                     机器码  DD mm100mmm
FSAVE   word ptr mem  FPU状态到mem                     机器码  9B DD mm110mmm

FFREE ST(i)           标志ST(i)未使用                  机器码  DD C0iii
FDECSTP               减少栈指针1->0 2->1              机器码  D9 F6
FINCSTP               增加栈指针0->1 1->2              机器码  D9 F7
FSETPM                浮点设置保护                     机器码  DB E4
---------- 二、数据传送指令 ----------------------------------------------------
FLDZ                  将0.0装入ST(0)                   机器码  D9 EE
FLD1                  将1.0装入ST(0)                   机器码  D9 E8
FLDPI                 将π装入ST(0)                    机器码  D9 EB
FLDL2T                将ln10/ln2装入ST(0)              机器码  D9 E9
FLDL2E                将1/ln2装入ST(0)                 机器码  D9 EA
FLDLG2                将ln2/ln10装入ST(0)              机器码  D9 EC
FLDLN2                将ln2装入ST(0)                   机器码  D9 ED

FLD    real4 ptr mem  装入mem的单精度浮点数            机器码  D9 mm000mmm
FLD    real8 ptr mem  装入mem的双精度浮点数            机器码  DD mm000mmm
FLD   real10 ptr mem  装入mem的十字节浮点数            机器码  DB mm101mmm

FILD    word ptr mem  装入mem的二字节整数              机器码  DF mm000mmm
FILD   dword ptr mem  装入mem的四字节整数              机器码  DB mm000mmm
FILD   qword ptr mem  装入mem的八字节整数              机器码  DF mm101mmm

FBLD   tbyte ptr mem  装入mem的十字节BCD数             机器码  DF mm100mmm

FST    real4 ptr mem  保存单精度浮点数到mem            机器码  D9 mm010mmm
FST    real8 ptr mem  保存双精度浮点数到mem            机器码  DD mm010mmm

FIST    word ptr mem  保存二字节整数到mem              机器码  DF mm010mmm
FIST   dword ptr mem  保存四字节整数到mem              机器码  DB mm010mmm

FSTP   real4 ptr mem  保存单精度浮点数到mem并出栈      机器码  D9 mm011mmm
FSTP   real8 ptr mem  保存双精度浮点数到mem并出栈      机器码  DD mm011mmm
FSTP  real10 ptr mem  保存十字节浮点数到mem并出栈      机器码  DB mm111mmm

FISTP   word ptr mem  保存二字节整数到mem并出栈        机器码  DF mm011mmm
FISTP  dword ptr mem  保存四字节整数到mem并出栈        机器码  DB mm011mmm
FISTP  qword ptr mem  保存八字节整数到mem并出栈        机器码  DF mm111mmm

FBSTP  tbyte ptr mem  保存十字节BCD数到mem并出栈       机器码  DF mm110mmm

FCMOVB                ST(0),ST(i) <时传送              机器码  DA C0iii
FCMOVBE               ST(0),ST(i) <=时传送             机器码  DA D0iii
FCMOVE                ST(0),ST(i) =时传送              机器码  DA C1iii
FCMOVNB               ST(0),ST(i) >=时传送             机器码  DB C0iii
FCMOVNBE              ST(0),ST(i) >时传送              机器码  DB D0iii
FCMOVNE               ST(0),ST(i) !=时传送             机器码  DB C1iii
FCMOVNU               ST(0),ST(i) 有序时传送           机器码  DB D1iii
FCMOVU                ST(0),ST(i) 无序时传送           机器码  DA D1iii
---------- 三、比较指令 --------------------------------------------------------
FCOM                  ST(0)-ST(1)                      机器码  D8 D1
FCOMI                 ST(0),ST(i)  ST(0)-ST(1)         机器码  DB F0iii
FCOMIP                ST(0),ST(i)  ST(0)-ST(1)并出栈   机器码  DF F0iii
FCOM   real4 ptr mem  ST(0)-实数mem                    机器码  D8 mm010mmm
FCOM   real8 ptr mem  ST(0)-实数mem                    机器码  DC mm010mmm

FICOM   word ptr mem  ST(0)-整数mem                    机器码  DE mm010mmm
FICOM  dword ptr mem  ST(0)-整数mem                    机器码  DA mm010mmm
FICOMP  word ptr mem  ST(0)-整数mem并出栈              机器码  DE mm011mmm
FICOMP dword ptr mem  ST(0)-整数mem并出栈              机器码  DA mm011mmm

FTST                  ST(0)-0                          机器码  D9 E4
FUCOM  ST(i)          ST(0)-ST(i)                      机器码  DD E0iii
FUCOMP ST(i)          ST(0)-ST(i)并出栈                机器码  DD E1iii
FUCOMPP               ST(0)-ST(1)并二次出栈            机器码  DA E9
FXAM                  ST(0)规格类型                    机器码  D9 E5
---------- 四、运算指令 --------------------------------------------------------
FADD                  把目的操作数 (直接接在指令后的变量或堆栈缓存器) 与来源操作数 (接在目的操作数后的变量或堆栈缓存器) 相加,并将结果存入目的操作数
FADDP  ST(i),ST       这个指令是使目的操作数加上 ST 缓存器,并弹出 ST 缓存器,而目的操作数必须是堆栈缓存器的其中之一,最后不管目的操作数为何,经弹出一次后,目的操作数会变成上一个堆栈缓存器了
FIADD                 FIADD 是把 ST 加上来源操作数,然后再存入 ST 缓存器,来源操作数必须是字组整数或短整数形态的变数

FSUB                  减
FSUBP
FSUBR                 减数与被减数互换
FSUBRP
FISUB
FISUBR

FMUL                  乘
FMULP
FIMUL

FDIV                  除
FDIVP
FDIVR
FDIVRP
FIDIV
FIDIVR

FCHS                  改变 ST 的正负值

FABS                  把 ST 之值取出,取其绝对值后再存回去。

FSQRT                 将 ST 之值取出,开根号后再存回去。

FSCALE                这个指令是计算 ST*2^ST(1)之值,再把结果存入 ST 里而 ST(1) 之值不变。ST(1) 必须是在 -32768 到 32768 (-215 到 215 )之间的整数,如果超过这个范围计算结果无法确定,如果不是整数 ST(1) 会先向零舍入成整数再计算。所以为安全起见,最好是由字组整数载入到 ST(1) 里。

FRNDINT               这个指令是把 ST 的数值舍入成整数,FPU 提供四种舍入方式,由 FPU 的控制字组(control word)中的 RC 两个位决定
                          RC    舍入控制
                          00    四舍五入
                          01    向负无限大舍入
                          10    向正无限大舍入
                          11    向零舍去
================================================================================
mujiok2003 2013-11-05
  • 打赏
  • 举报
回复
引用 2 楼 a991176515 的回复:
[quote=引用 1 楼 mujiok2003 的回复:]
看看文档吧。

我没找到有关浮点数的指令和例子。。。[/quote]
指令跟CPU有关

THFG 2013-11-05
  • 打赏
  • 举报
回复
引用 1 楼 mujiok2003 的回复:
看看文档吧。
我没找到有关浮点数的指令和例子。。。
mujiok2003 2013-11-05
  • 打赏
  • 举报
回复
看看文档吧。
目录 历史 前言 I. C语言入门 1. 程序的基本概念 1. 程序和编程语言 2. 自然语言和形式语言 3. 程序的调试 4. 第一个程序 2. 常量、变量和表达式 1. 继续Hello World 2. 常量 3. 变量 4. 赋值 5. 表达式 6. 字符类型与字符编码 3. 简单函数 1. 数学函数 2. 自定义函数 3. 形参和实参 4. 全局变量、局部变量和作用域 4. 分支语句 1. if语句 2. if/else语句 3. 布尔代数 4. switch语句 5. 深入理解函数 1. return语句 2. 增量式开发 3. 递归 6. 循环语句 1. while语句 2. do/while语句 3. for语句 4. break和continue语句 5. 嵌套循环 6. goto语句和标号 7. 结构体 1. 复合类型与结构体 2. 数据抽象 3. 数据类型标志 4. 嵌套结构体 8. 数组 1. 数组的基本概念 2. 数组应用实例:统计随机数 3. 数组应用实例:直方图 4. 字符串 5. 多维数组 9. 编码风格 1. 缩进和空白 2. 注释 3. 标识符命名 4. 函数 5. indent工具 10. gdb 1. 单步执行和跟踪函数调用 2. 断点 3. 观察点 4. 段错误 11. 排序与查找 1. 算法的概念 2. 插入排序 3. 算法的时间复杂度分析 4. 归并排序 5. 线性查找 6. 折半查找 12. 栈与队列 1. 数据结构的概念 2. 堆栈 3. 深度优先搜索 4. 队列与广度优先搜索 5. 环形队列 13. 本阶段总结 II. C语言本质 14. 计算机中数的表示 1. 为什么计算机用二进制计数 2. 不同进制之间的换算 3. 整数的加减运算 3.1. Sign and Magnitude表示法 3.2. 1's Complement表示法 3.3. 2's Complement表示法 3.4. 有符号数和无符号数 4. 浮点数 15. 数据类型详解 1. 整型 2. 浮点型 3. 类型转换 3.1. Integer Promotion 3.2. Usual Arithmetic Conversion 3.3. 由赋值产生的类型转换 3.4. 强制类型转换 3.5. 编译器如何处理类型转换 16. 运算符详解 1. 位运算 1.1. 按位与、或、异或、取反运算 1.2. 移位运算 1.3. 掩码 1.4. 异或运算的一些特性 2. 其它运算符 2.1. 复合赋值运算符 2.2. 条件运算符 2.3. 逗号运算符 2.4. sizeof运算符与typedef类型声明 3. Side Effect与Sequence Point 4. 运算符总结 17. 计算机体系结构基础 1. 内存与地址 2. CPU 3. 设备 4. MMU 5. Memory Hierarchy 18. x86汇编程序基础 1. 最简单的汇编程序 2. x86的寄存器 3. 第二个汇编程序 4. 寻址方式 5. ELF文件 5.1. 目标文件 5.2. 可执行文件 19. 汇编与C之间的关系 1. 函数调用 2. main函数和启动例程 3. 变量的存储布局 4. 结构体和联合体 5. C内联汇编 6. volatile限定符 20. 链接详解 1. 多目标文件的链接 2. 定义和声明 2.1. extern和static关键字 2.2. 头文件 2.3. 定义和声明的详细规则 3. 静态库 4. 共享库 4.1. 编译、链接、运行 4.2. 动态链接的过程 4.3. 共享库的命名惯例 5. 虚拟内存管理 21. 预处理 1. 预处理的步骤 2. 宏定义 2.1. 函数式宏定义 2.2. 内联函数 2.3. #、##运算符和可变参数 2.4. 宏展开的步骤 3. 条件预处理指示 4. 其它预处理特性 22. Makefile基础 1. 基本规则 2. 隐含规则和模式规则 3. 变量 4. 自动处理头文件的依赖关系 5. 常用的make命令行选项 23. 指针 1. 指针的基本概念 2. 指针类型的参数和返回值 3. 指针与数组 4. 指针与const限定符 5. 指针与结构体 6. 指向指针的指针与指针数组 7. 指向数组的指针与多维数组 8. 函数类型和函数指针类型 9. 不完全类型和复杂声明 24. 函数接口 1. 本章的预备知识 1.1. strcpy与strncpy 1.2. malloc与free 2. 传入参数与传出参数 3. 两层指针的参数 4. 返回值是指针的情况 5. 回调函数 6. 可变参数 25. C标准库 1. 字符串操作函数 1.1. 初始化字符串 1.2. 取字符串的长度 1.3. 拷贝字符串 1.4. 连接字符串 1.5. 比较字符串 1.6. 搜索字符串 1.7. 分割字符串 2. 标准I/O库函数 2.1. 文件的基本概念 2.2. fopen/fclose 2.3. stdin/stdout/stderr 2.4. errno与perror函数 2.5. 以字节为单位的I/O函数 2.6. 操作读写位置的函数 2.7. 以字符串为单位的I/O函数 2.8. 以记录为单位的I/O函数 2.9. 格式化I/O函数 2.10. C标准库的I/O缓冲区 2.11. 本节综合练习 3. 数值字符串转换函数 4. 分配内存的函数 26. 链表、二叉树和哈希表 1. 链表 1.1. 单链表 1.2. 双向链表 1.3. 静态链表 1.4. 本节综合练习 2. 二叉树 2.1. 二叉树的基本概念 2.2. 排序二叉树 3. 哈希表 27. 本阶段总结 III. Linux系统编程 28. 文件与I/O 1. 汇编程序的Hello world 2. C标准I/O库函数与Unbuffered I/O函数 3. open/close 4. read/write 5. lseek 6. fcntl 7. ioctl 8. mmap 29. 文件系统 1. 引言 2. ext2文件系统 2.1. 总体存储布局 2.2. 实例剖析 2.3. 数据块寻址 2.4. 文件和目录操作的系统函数 3. VFS 3.1. 内核数据结构 3.2. dup和dup2函数 30. 进程 1. 引言 2. 环境变量 3. 进程控制 3.1. fork函数 3.2. exec函数 3.3. wait和waitpid函数 4. 进程间通信 4.1. 管道 4.2. 其它IPC机制 5. 练习:实现简单的Shell 31. Shell脚本 1. Shell的历史 2. Shell如何执行命令 2.1. 执行交互式命令 2.2. 执行脚本 3. Shell的基本语法 3.1. 变量 3.2. 文件名代换(Globbing):* ? [] 3.3. 命令代换:`或 $() 3.4. 算术代换:$(()) 3.5. 转义字符\ 3.6. 单引号 3.7. 双引号 4. bash启动脚本 4.1. 作为交互登录Shell启动,或者使用--login参数启动 4.2. 以交互非登录Shell启动 4.3. 非交互启动 4.4. 以sh命令启动 5. Shell脚本语法 5.1. 条件测试:test [ 5.2. if/then/elif/else/fi 5.3. case/esac 5.4. for/do/done 5.5. while/do/done 5.6. 位置参数和特殊变量 5.7. 函数 6. Shell脚本的调试方法 32. 正则表达式 1. 引言 2. 基本语法 3. sed 4. awk 5. 练习:在C语言中使用正则表达式 33. 信号 1. 信号的基本概念 2. 产生信号 2.1. 通过终端按键产生信号 2.2. 调用系统函数向进程发信号 2.3. 由软件条件产生信号 3. 阻塞信号 3.1. 信号在内核中的表示 3.2. 信号集操作函数 3.3. sigprocmask 3.4. sigpending 4. 捕捉信号 4.1. 内核如何实现信号的捕捉 4.2. sigaction 4.3. pause 4.4. 可重入函数 4.5. sig_atomic_t类型与volatile限定符 4.6. 竞态条件与sigsuspend函数 4.7. 关于SIGCHLD信号 34. 终端、作业控制与守护进程 1. 终端 1.1. 终端的基本概念 1.2. 终端登录过程 1.3. 网络登录过程 2. 作业控制 2.1. Session与进程组 2.2. 与作业控制有关的信号 3. 守护进程 35. 线程 1. 线程的概念 2. 线程控制 2.1. 创建线程 2.2. 终止线程 3. 线程间同步 3.1. mutex 3.2. Condition Variable 3.3. Semaphore 3.4. 其它线程间同步机制 4. 编程练习 36. TCP/IP协议基础 1. TCP/IP协议栈与数据包封装 2. 以太网(RFC 894)帧格式 3. ARP数据报格式 4. IP数据报格式 5. IP地址与路由 6. UDP段格式 7. TCP协议 7.1. 段格式 7.2. 通讯时序 7.3. 流量控制 37. socket编程 1. 预备知识 1.1. 网络字节序 1.2. socket地址的数据类型及相关函数 2. 基于TCP协议的网络程序 2.1. 最简单的TCP网络程序 2.2. 错误处理与读写控制 2.3. 把client改为交互式输入 2.4. 使用fork并发处理多个client的请求 2.5. setsockopt 2.6. 使用select 3. 基于UDP协议的网络程序 4. UNIX Domain Socket IPC 5. 练习:实现简单的Web服务器 5.1. 基本HTTP协议 5.2. 执行CGI程序 A. 字符编码 1. ASCII码 2. Unicode和UTF-8 3. 在Linux C编程中使用Unicode和UTF-8 B. GNU Free Documentation License Version 1.3, 3 November 2008 参考书目 索引

15,440

社区成员

发帖
与我相关
我的任务
社区描述
C/C++ 非技术区
社区管理员
  • 非技术区社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧