汇编语言浮点数指令集
汇编浮点指令

汇编浮点指令浮点数如何存储浮点数的运算完全不同于整数,从寄存器到指令,都有⼀套独特的处理流程,浮点单元也称作x87 FPU。
现在看浮点数的表⽰⽅式,我们所知道的,计算机使⽤⼆进制存储数据,所表⽰的数字都具有确定性,那是如何表⽰浮点这种具有近似效果的数据呢,答案是通过科学计数,科学计数由符号,尾数和指数表⽰,这三部分都是⼀个整数值,具体来看⼀下IEEE⼆进制浮点标准:格式说明单精度32位:符号占1位,指数占8位,尾数中的⼩数部分占23位双精度64位:符号占1位,指数占11位,尾数中的⼩数部分占52位扩展精度80位:符号占1位,指数占16位,尾数中的⼩数部分占63位以单精度为例,在内存中的储存格式如下(左边为⾼位):| 1位符号 | 8位指数 | 23位尾数 |其中符号位1表⽰负数,0表⽰正数,这与整数形式的符号位意义相同;科学计数法表⽰形式如 m * (b ^ e),m为尾数,b为基数,e是指数,再⼆进制中,基数毫⽆疑问是2,对单精度,指数为中间8位⼆进制表⽰的数字,其中的尾数是形如1.1101 ⼩数点后⾯的整数值。
关于指数,由于需要表⽰正负两种数据,IEEE标准规定单精度指数以127为分割线,实际存储的数据是指数加127所得结果,127为⾼位为零,后7位为1所得,其他双精度也以此⽅式计算。
为了解释内存中浮点数的存储⽅式,举⼀个浮点数的例⼦说明:float test = 123.456;int main(){return 0;}例⼦再简单不过了,仅仅定义了⼀个全局的float类型,我们通过gcc -S test.c来⽣成汇编,看看123.456是如何存储的,打开反汇编后的⽂件,看到符号_test后定义的数字是1123477881(这⾥gcc定义成了long类型,不过没有关系,因为都是四字节数字,具体的类型还得看如何使⽤)。
可以使⽤计算器把⼗进制数字转化为⼆进制:0 10000101 11101101110100101111001,这⾥根据单精度的划分⽅式把32位划分成三部分,符号位为0,为正数,指数为 133,减去127得6,尾数加上1.,形式为1.11101101110100101111001,扩⼤2 ^ 23次⽅为111101101110100101111001,⼗进制16181625,后除以2 ^ (23 – 6) = 131072,结果为123.45600128173828125,与我们所定义的浮点数正好相符。
浮点指令

浮点指令数据格式符号(Sign):表示数据正负,在最高数据位,正0负1指数(Exponent):也称阶码,以2为底的幂,采用偏移码表示,恒为整数有效数字(Significand):表示数据的有效位数,反应数据的精度单精度浮点数- 32位符号(1位)指数(8位)有效数字(23位)单精度格式8位指数的偏移基数为127阶码数值范围:-126 ~ 127双精度浮点数- 64位S - 1E - 11M - 52//===================================================== 浮点数据转实数表达式:(-1)^S × (1+M) ×2^E例:0x4996B438 - 1234567二进制数据:01001001100101101011010000111000符号- 0阶码- 147有效数字- 0.00101101011010000111000 b (0.177374839782715)浮点寄存器主要有通用数据寄存器、状态寄存器、控制寄存器、标记寄存器数据寄存器OD的浮点寄存器状态寄存器15 B 14C313-11TOP10C29C18C07ES6SF5PE4UE3OE2ZE1DEIEOD中的状态寄存器浮点指令取数指令取数值令从存储器或浮点数据寄存器中区的数据,压入寄存器栈顶st(0)。
FLD - 取存储器或st(i)中的浮点数,压入st(0)FILD - 取存储器的整数,压入st(0)存数指令存数,出栈FSTP - st(0)按浮点格式存入存储器或st(i),然后出栈FISTP - st(0)按整数格式存入存储器,然后出栈比较指令浮点比较指令比较栈顶数据与源操作数,结果通过状态寄存器反映。
状态寄存器中的C3 C2 C0用来反映比较结果,C1表示数据寄存器出现上溢或下溢。
比较指令的结果比较结果C3 C2 C0 st(0)>源操作数0 0 0st(0)<源操作数0 0 1st(0)=源操作数 1 0 0不可排序 1 1 1FCOM - 浮点数比较,st(0)和st(1)比较FCOMP - 浮点数比较,st(0)和st(1)比较并出栈运算指令FADD - st(0) += st(1)FSUB - st(0) -= st(1)FMUL - st(0) *= st(1)FDIV - st(0) /= st(1)FABS - st(0) = |st(0)|。
浮点数汇编指令集

fsub st(num),st ;计算st(num)减st的值;用差值替换st(num)
fsub st,st(num) ;计算st减st(num)的值;用差值来替换st
fsub memory(real) ;计算st减存储器中的实型数的值;用差值来替换st
fidivr memory(integer);计算存储器中的整型数/st;用商来替换st
fdivrp st(num),st ;计算st/st(num)的值,用商来替换st(num);并将st出栈
;//////////////////////////////////////////////////////////////////////////////
fmul st(num),st ;将st(num)和st相乘;用乘积来替换st(num)
fmul st,st(num) ;将st和st(num)相乘;用乘积来替换st
fmul memory(real) ;将st和存储器中的实型数相乘;用乘积来替换st
fstp memory(real) ;复制st的值为实型数,存入存储器;st出栈
fist memory(integer) ;复制st的值,并转换为整型数存入存储器
fistp memory(integer) ;复制st的值,并转换为整型数存入存储器;st出栈
fbstp memory(BCD) ;复制st的值,并转换为BCD码存入存储器;st出栈
fimul memory(integer) ;将st和存储器中的整型数相乘,用乘积来替换st
fmulp st(num),st ;将st(num)和st相乘;乘积来替换st(num);并将st出栈
;助记符 操作数 功能
汇编语言只用ADD指令实现整数和浮点数的加减乘法

lea bx,user_string
mov ah,0ah
int 21h
mov ch,0
add bx,2;指向真正字符串开始的位置
mov ah,0
mov cl,8
add cl,255
beginin:
mov al,[bx]
add al,208;将字符串变为数值
rol bx,1;取第一个操作码到cf
jnc INTEGER;CF=0
jc others;CF=1
INTEGER:
rol bx,1;取第二个操作码到cf
jnc INTEGERadd;CF=0
jc INTEGERsub;CF=1
INTEGERadd:
call INTEGER_ADD
INTEGERsub:
mov bl,0
rol bx,cl;取第二个定点数放到bl
mov cl,bl;转存到cl
and cx,cx
jz FLOATadd
test cx,10h
jz FLOATsub
test cx,20h
jz FLOATmul
FLOATadd:
call FLOAT_ADD
FLOATsub:
call FLOAT_SUB
INTEGER_ADD proc near
mov bl,0
mov cl,3
rol bx,cl;取第一个操作数放到bl
mov ch,bl;转存到ch
mov bl,0
rol bx,cl;取第二个操作数放到bl
mov cl,bl;转存到ch
add ch,cl;第一个操作数和第二个操作数做加法
mov result,ch
ce 自动汇编 浮点

ce 自动汇编浮点CE指的是8086微处理器的指令集架构中的Compare and Exchange指令,该指令用于实现多线程同步操作。
在汇编语言中,浮点数的处理涉及到浮点运算指令、浮点寄存器以及浮点数的格式。
我将按照以下几个方面详细介绍CE指令及相关内容。
一、浮点运算指令:在8086指令集中,浮点运算指令主要包括加法、减法、乘法和除法等。
这些指令利用浮点寄存器来进行计算。
具体的指令如下:1. FADD:浮点加法指令,用于对两个浮点数进行相加操作。
例如,FADD ST(0), ST(1)表示将ST(1)寄存器中的浮点数与ST(0)寄存器中的浮点数相加,并将结果存储在ST(0)寄存器中。
2. FSUB:浮点减法指令,用于对两个浮点数进行相减操作。
例如,FSUB ST(0), ST(1)表示将ST(1)寄存器中的浮点数减去ST(0)寄存器中的浮点数,并将结果存储在ST(0)寄存器中。
3. FMUL:浮点乘法指令,用于对两个浮点数进行相乘操作。
例如,FMUL ST(0), ST(1)表示将ST(1)寄存器中的浮点数与ST(0)寄存器中的浮点数相乘,并将结果存储在ST(0)寄存器中。
4. FDIV:浮点除法指令,用于对两个浮点数进行相除操作。
例如,FDIV ST(0), ST(1)表示将ST(1)寄存器中的浮点数除以ST(0)寄存器中的浮点数,并将结果存储在ST(0)寄存器中。
二、浮点寄存器:8086微处理器中的浮点数是通过浮点寄存器来进行存储和计算的。
浮点寄存器主要有FPU(浮点处理器单元)中的堆栈寄存器(ST)和数据寄存器(DR)。
1. 堆栈寄存器(ST):堆栈寄存器(ST)是存储浮点操作数的寄存器堆栈,它有8个寄存器(ST(0)-ST(7)),其中ST(0)是栈顶寄存器。
浮点运算指令通常通过操作堆栈中的寄存器来进行计算。
2. 数据寄存器(DR):数据寄存器(DR)用于存储浮点操作数的中间结果或者常数。
浮点运算指令309-319

描述
当触发器变为ON时, 将由S1和S2指定浮点数(2字)相加. 结果存放到D+1和D. [S1+1, S1] + [S2+1, S2] → [D+1, D] 由[S1]和[S2]指定整型数据时, 在运算之前整型数将被转换为浮点数.
3-478
如果由[D]指定整型数, 则浮点数将被自动转换为整型数.
3-478
如果由[D]指定整型数, 则浮点数将被自动转换为整型数.
如果在S1或S2中指定了K常数, 则运算处理与指定整型数时的相同. 有关整型数处理的详细内容, 请参阅有关章节.
示例程序
当R0变为ON时, f5.432100被存放到DT30和DT31中.
编程时注意事项
本指令F313(F%)不能在中断程序中使用.
适用机型 FP-e/FP0/FP∑/FP2/FP2SH/FP10SH
概述 程序示例
将两个实数相乘, 结果存放到指定的32-bit存储区. FP0不支持P型的高级指令.
触发器
梯形图程序
S1 浮点数(32位)或32位数据的低16位的地址(被乘数).
S2 浮点数(32位)或32位数据的低16位的地址(乘数).
·错误标志(R9008) 当以下情况时瞬间变为ON - 使用索引寄存器指定数据区超出范围
3-483
F310(F+) P310(PF+)
浮点数加法
适用机型 FP-e/FP0/FP∑/FP2/FP2SH/FP10SH
概述 程序示例
将两个实数相加, 结果存放到指定的32-bit存储区. FP0不支持P型的高级指令.
继电器
WY WR AA AA AA
定时器计数器 数据寄存器 索引寄存器
汇编语言指令大全X86和X87汇编指令大全(带注释)
汇编语⾔指令⼤全X86和X87汇编指令⼤全(带注释)⽬录⼀、数据传输指令1. 通⽤数据传送指令.2. 输⼊输出端⼝传送指令.3. ⽬的地址传送指令.4. 标志传送指令.⼆、算术运算指令三、逻辑运算指令四、串指令五、程序转移指令六、伪指令七、处理机控制指令:标志处理指令浮点运算指令集1、控制指令2、数据传送指令3、⽐较指令4、运算指令其它1.机械码,⼜称机器码.2.需要熟练掌握的全部汇编知识(只有这么多)3.常见修改(机器码)4.两种不同情况的不同修改⽅法⼀、数据传输指令它们在存贮器和寄存器、寄存器和输⼊输出端⼝之间传送数据.1. 通⽤数据传送指令.MOV 传送字或字节.MOVSX 先符号扩展,再传送.MOVZX 先零扩展,再传送.PUSH 把字压⼊堆栈.POP 把字弹出堆栈.PUSHA 把AX,CX,DX,BX,SP,BP,SI,DI依次压⼊堆栈.POPA 把DI,SI,BP,SP,BX,DX,CX,AX依次弹出堆栈.PUSHAD 把EAX,ECX,EDX,EBX,ESP,EBP,ESI,EDI依次压⼊堆栈.POPAD 把EDI,ESI,EBP,ESP,EBX,EDX,ECX,EAX依次弹出堆栈.BSWAP 交换32位寄存器⾥字节的顺序XCHG 交换字或字节.(⾄少有⼀个操作数为寄存器,段寄存器不可作为操作数)CMPXCHG ⽐较并交换操作数.(第⼆个操作数必须为累加器AL/AX/EAX)XADD 先交换再累加.(结果在第⼀个操作数⾥)XLAT 字节查表转换.----BX指向⼀张256字节的表的起点,AL为表的索引值(0-255,即0-FFH);返回AL为查表结果.([BX+AL]->AL)2. 输⼊输出端⼝传送指令.IN I/O端⼝输⼊. ( 语法: IN 累加器, {端⼝号│DX} )OUT I/O端⼝输出. ( 语法: OUT {端⼝号│DX},累加器 )输⼊输出端⼝由⽴即⽅式指定时, 其范围是 0-255; 由寄存器 DX 指定时,其范围是 0-65535.3. ⽬的地址传送指令.LEA 装⼊有效地址.例: LEA DX,string ;把偏移地址存到DX.LDS 传送⽬标指针,把指针内容装⼊DS.例: LDS SI,string ;把段地址:偏移地址存到DS:SI.LES 传送⽬标指针,把指针内容装⼊ES.例: LES DI,string ;把段地址:偏移地址存到ES:DI.LFS 传送⽬标指针,把指针内容装⼊FS.例: LFS DI,string ;把段地址:偏移地址存到FS:DI.LGS 传送⽬标指针,把指针内容装⼊GS.例: LGS DI,string ;把段地址:偏移地址存到GS:DI.LSS 传送⽬标指针,把指针内容装⼊SS.例: LSS DI,string ;把段地址:偏移地址存到SS:DI.4. 标志传送指令.LAHF 标志寄存器传送,把标志装⼊AH.SAHF 标志寄存器传送,把AH内容装⼊标志寄存器.PUSHF 标志⼊栈.POPF 标志出栈.PUSHD 32位标志⼊栈.POPD 32位标志出栈.⼆、算术运算指令ADD 加法.ADC 带进位加法.INC 加 1.AAA 加法的ASCII码调整.DAA 加法的⼗进制调整.SUB 减法.SBB 带借位减法.DEC 减 1.NEG 求反(以 0 减之).CMP ⽐较.(两操作数作减法,仅修改标志位,不回送结果).AAS 减法的ASCII码调整.DAS 减法的⼗进制调整.MUL ⽆符号乘法.结果回送AH和AL(字节运算),或DX和AX(字运算),IMUL 整数乘法.结果回送AH和AL(字节运算),或DX和AX(字运算),AAM 乘法的ASCII码调整.DIV ⽆符号除法.结果回送:商回送AL,余数回送AH, (字节运算);或商回送AX,余数回送DX, (字运算).IDIV 整数除法.结果回送:商回送AL,余数回送AH, (字节运算);或商回送AX,余数回送DX, (字运算).AAD 除法的ASCII码调整.CBW 字节转换为字. (把AL中字节的符号扩展到AH中去)CWD 字转换为双字. (把AX中的字的符号扩展到DX中去)CWDE 字转换为双字. (把AX中的字符号扩展到EAX中去)CDQ 双字扩展. (把EAX中的字的符号扩展到EDX中去)三、逻辑运算指令AND 与运算.XOR 异或运算.NOT 取反.TEST 测试.(两操作数作与运算,仅修改标志位,不回送结果).SHL 逻辑左移.SAL 算术左移.(=SHL)SHR 逻辑右移.SAR 算术右移.(=SHR)ROL 循环左移.ROR 循环右移.RCL 通过进位的循环左移.RCR 通过进位的循环右移.以上⼋种移位指令,其移位次数可达255次.移位⼀次时, 可直接⽤操作码. 如 SHL AX,1.移位>1次时, 则由寄存器CL给出移位次数.如 MOV CL,04 SHL AX,CL四、串指令DS:SI 源串段寄存器 :源串变址.ES:DI ⽬标串段寄存器:⽬标串变址.CX 重复次数计数器.AL/AX 扫描值.D标志 0表⽰重复操作中SI和DI应⾃动增量; 1表⽰应⾃动减量.Z标志⽤来控制扫描或⽐较操作的结束.MOVS 串传送.( MOVSB 传送字符. MOVSW 传送字. MOVSD 传送双字. )CMPS 串⽐较.( CMPSB ⽐较字符. CMPSW ⽐较字. )SCAS 串扫描.把AL或AX的内容与⽬标串作⽐较,⽐较结果反映在标志位.LODS 装⼊串.把源串中的元素(字或字节)逐⼀装⼊AL或AX中.( LODSB 传送字符. LODSW 传送字. LODSD 传送双字. ) STOS 保存串.是LODS的逆过程.REP 当CX/ECX<>0时重复.REPE/REPZ 当ZF=1或⽐较结果相等,且CX/ECX<>0时重复.REPNE/REPNZ 当ZF=0或⽐较结果不相等,且CX/ECX<>0时重复.REPC 当CF=1且CX/ECX<>0时重复.REPNC 当CF=0且CX/ECX<>0时重复.五、程序转移指令1. ⽆条件转移指令 (长转移)JMP ⽆条件转移指令CALL 过程调⽤RET/RETF 过程返回.2. 条件转移指令 (短转移,-128到+127的距离内)( 当且仅当(SF XOR OF)=1时,OP1<OP2 )JA/JNBE 不⼩于或不等于时转移.JAE/JNB ⼤于或等于转移.JB/JNAE ⼩于转移.JBE/JNA ⼩于或等于转移.以上四条,测试⽆符号整数运算的结果(标志C和Z).JG/JNLE ⼤于转移.JGE/JNL ⼤于或等于转移.JL/JNGE ⼩于转移.JLE/JNG ⼩于或等于转移.以上四条,测试带符号整数运算的结果(标志S,O和Z).JE/JZ 等于转移.JNE/JNZ 不等于时转移.JC 有进位时转移.JNC ⽆进位时转移.JNO 不溢出时转移.JNP/JPO 奇偶性为奇数时转移.JNS 符号位为 "0" 时转移.JO 溢出转移.JP/JPE 奇偶性为偶数时转移.JS 符号位为 "1" 时转移.3. 循环控制指令(短转移)LOOP CX不为零时循环.LOOPE/LOOPZ CX不为零且标志Z=1时循环.LOOPNE/LOOPNZ CX不为零且标志Z=0时循环.JCXZ CX为零时转移.JECXZ ECX为零时转移.4. 中断指令INT 中断指令INTO 溢出中断IRET 中断返回5. 处理器控制指令HLT 处理器暂停, 直到出现中断或复位信号才继续.WAIT 当芯⽚引线TEST为⾼电平时使CPU进⼊等待状态.ESC 转换到外处理器.LOCK 封锁总线.NOP 空操作.STC 置进位标志位.CLC 清进位标志位.CMC 进位标志取反.STD 置⽅向标志位.CLD 清⽅向标志位.STI 置中断允许位.CLI 清中断允许位.六、伪指令DW 定义字(2字节).PROC 定义过程.ENDP 过程结束.SEGMENT 定义段.ASSUME 建⽴段寄存器寻址.ENDS 段结束.END 程序结束.七、处理机控制指令:标志处理指令CMC 进位位求反指令STC 进位位置为1指令CLD ⽅向标志置1指令STD ⽅向标志位置1指令CLI 中断标志置0指令STI 中断标志置1指令NOP ⽆操作HLT 停机WAIT 等待ESC 换码LOCK 封锁浮点运算指令集1、控制指令(带9B的控制指令前缀F变为FN时浮点不检查,机器码去掉9B)FINIT 初始化浮点部件机器码 9B DB E3FCLEX 清除异常机器码 9B DB E2FDISI 浮点检查禁⽌中断机器码 9B DB E1FENI 浮点检查禁⽌中断⼆机器码 9B DB E0WAIT 同步CPU和FPU 机器码 9BFWAIT 同步CPU和FPU 机器码 D9 D0FNOP ⽆操作机器码 DA E9FXCH 交换ST(0)和ST(1) 机器码 D9 C9FXCH ST(i) 交换ST(0)和ST(i) 机器码 D9 C1iiiFSTSW ax 状态字到ax 机器码 9B DF E0FSTSW word ptr mem 状态字到mem 机器码 9B DD mm111mmmFLDCW word ptr mem mem到状态字机器码 D9 mm101mmmFSTCW word ptr mem 控制字到mem 机器码 9B D9 mm111mmmFLDENV word ptr mem mem到全环境机器码 D9 mm100mmmFSTENV word ptr mem 全环境到mem 机器码 9B D9 mm110mmmFRSTOR word ptr mem mem到FPU状态机器码 DD mm100mmmFSAVE word ptr mem FPU状态到mem 机器码 9B DD mm110mmmFFREE ST(i) 标志ST(i)未使⽤机器码 DD C0iiiFDECSTP 减少栈指针1->0 2->1 机器码 D9 F6FINCSTP 增加栈指针0->1 1->2 机器码 D9 F7FSETPM 浮点设置保护机器码 DB E42、数据传送指令FLDZ 将0.0装⼊ST(0) 机器码 D9 EEFLD1 将1.0装⼊ST(0) 机器码 D9 E8FLDPI 将π装⼊ST(0) 机器码 D9 EBFLDL2T 将ln10/ln2装⼊ST(0) 机器码 D9 E9FLDL2E 将1/ln2装⼊ST(0) 机器码 D9 EAFLDLG2 将ln2/ln10装⼊ST(0) 机器码 D9 ECFLDLN2 将ln2装⼊ST(0) 机器码 D9 EDFLD real4 ptr mem 装⼊mem的单精度浮点数机器码 D9 mm000mmmFLD real8 ptr mem 装⼊mem的双精度浮点数机器码 DD mm000mmmFLD real10 ptr mem 装⼊mem的⼗字节浮点数机器码 DB mm101mmmFILD word ptr mem 装⼊mem的⼆字节整数机器码 DF mm000mmmFILD dword ptr mem 装⼊mem的四字节整数机器码 DB mm000mmmFILD qword ptr mem 装⼊mem的⼋字节整数机器码 DF mm101mmmFBLD tbyte ptr mem 装⼊mem的⼗字节BCD数机器码 DF mm100mmmFST real4 ptr mem 保存单精度浮点数到mem 机器码 D9 mm010mmmFST real8 ptr mem 保存双精度浮点数到mem 机器码 DD mm010mmmFIST word ptr mem 保存⼆字节整数到mem 机器码 DF mm010mmmFIST dword ptr mem 保存四字节整数到mem 机器码 DB mm010mmmFSTP real4 ptr mem 保存单精度浮点数到mem并出栈机器码 D9 mm011mmmFSTP real8 ptr mem 保存双精度浮点数到mem并出栈机器码 DD mm011mmmFSTP real10 ptr mem 保存⼗字节浮点数到mem并出栈机器码 DB mm111mmmFISTP word ptr mem 保存⼆字节整数到mem并出栈机器码 DF mm011mmmFISTP dword ptr mem 保存四字节整数到mem并出栈机器码 DB mm011mmmFISTP qword ptr mem 保存⼋字节整数到mem并出栈机器码 DF mm111mmmFBSTP tbyte ptr mem 保存⼗字节BCD数到mem并出栈机器码 DF mm110mmmFCMOVB ST(0),ST(i) <时传送机器码 DA C0iiiFCMOVBE ST(0),ST(i) <=时传送机器码 DA D0iiiFCMOVE ST(0),ST(i) =时传送机器码 DA C1iiiFCMOVNB ST(0),ST(i) >=时传送机器码 DB C0iiiFCMOVNBE ST(0),ST(i) >时传送机器码 DB D0iiiFCMOVNE ST(0),ST(i) !=时传送机器码 DB C1iiiFCMOVNU ST(0),ST(i) 有序时传送机器码 DB D1iiiFCMOVU ST(0),ST(i) ⽆序时传送机器码 DA D1iii3、⽐较指令FCOM ST(0)-ST(1) 机器码 D8 D1FCOMI ST(0),ST(i) ST(0)-ST(1) 机器码 DB F0iiiFCOMIP ST(0),ST(i) ST(0)-ST(1)并出栈机器码 DF F0iiiFCOM real4 ptr mem ST(0)-实数mem 机器码 D8 mm010mmmFCOM real8 ptr mem ST(0)-实数mem 机器码 DC mm010mmmFICOM word ptr mem ST(0)-整数mem 机器码 DE mm010mmmFICOM dword ptr mem ST(0)-整数mem 机器码 DA mm010mmmFICOMP word ptr mem ST(0)-整数mem并出栈机器码 DE mm011mmmFICOMP dword ptr mem ST(0)-整数mem并出栈机器码 DA mm011mmmFTST ST(0)-0 机器码 D9 E4FUCOM ST(i) ST(0)-ST(i) 机器码 DD E0iiiFUCOMP ST(i) ST(0)-ST(i)并出栈机器码 DD E1iiiFUCOMPP ST(0)-ST(1)并⼆次出栈机器码 DA E9FXAM ST(0)规格类型机器码 D9 E54、运算指令FADD 把⽬的操作数 (直接接在指令后的变量或堆栈缓存器) 与来源操作数 (接在⽬的操作数后的变量或堆栈缓存器) 相加,并将结果存⼊⽬的操作数FADDP ST(i),ST 这个指令是使⽬的操作数加上 ST 缓存器,并弹出 ST 缓存器,⽽⽬的操作数必须是堆栈缓存器的其中之⼀,最后不管⽬的操作数为何,经弹出⼀次后,⽬的操作数会变成上⼀个堆栈缓存器了FIADD FIADD 是把 ST 加上来源操作数,然后再存⼊ ST 缓存器,来源操作数必须是字组整数或短整数形态的变数FSUB 减FSUBPFSUBR 减数与被减数互换FSUBRPFISUBFISUBRFMUL 乘FMULPFIMULFDIV 除FDIVPFDIVRFDIVRPFIDIVFIDIVRFCHS 改变 ST 的正负值FABS 把 ST 之值取出,取其绝对值后再存回去。
浮点数运算指令整理
st(0) st(0) st(0) st(0) st(0) st(0) st(0)
<- 0.0 <- 1.0 <- ?(ie, pi) <- log2(10) <- log2(e) <- log10(2) <- loge(2)
FST dest FSTP dest FIST dest FISTP dest FBST dest FBSTP dest 2.比较指令
<-st(0) + src (mem16/mem32)
st(0) <- st(0) - st(1) st(0) <-st(0) - src (reg/mem) st(i) <-st(i) - st(0) st(i) <-st(i) - st(0),然后执行一次出栈操
作
st(0) <- st(i) - st(0) st(0) <- st(i) - st(0),然后执行一次出
FSUBRP st(i),st
FISUB src FISUBR src 乘法 FMUL FMUL st(i) FMUL st(i),st
FMULP st(i),st
FIMUL src 除法 FDIV FDIV st(i) FDIV st(i),st
FDIVP st(i),st
FIDIV src FDIVR st(i),st
指令含义
FUCOMP st(i) FUCOMPP st(i) FXAM 3.运算指令
指令格式 加法 FADD FADD src FADD st(i),st
FADDP st(i),st
FIADD src 减法 FSUB FSUB src FSUB st(i),st
FSUBP st(i),st
汇编addss指令
汇编addss指令
ADDSS 是x86 架构下的SIMD (单指令多数据) 指令,属于SSE (Streaming SIMD Extensions) 指令集的一部分。
它主要用于浮点数计算。
ADDSS 指令执行单精度浮点数(32位)的加法操作。
它操作两个源操作数,并将结果存储在目标操作数中。
指令格式如下:
css
ADDSS xmm1, xmm2/m32
xmm1:目标操作数,一个128 位的XMM 寄存器,用于存储加法结果。
xmm2:第一个源操作数,也是一个128 位的XMM 寄存器。
m32:第二个源操作数,一个32 位的内存地址。
操作:
xmm2 的低32 位与m32 的内容进行加法操作。
结果存储在xmm1 的低32 位中,而xmm1 的高96 位保持不变。
注意:ADDSS 只操作低32 位的单精度浮点数,而忽略其他位。
在实际应用中,这种指令通常用于图形处理、物理模拟、科学计算等需要高速浮点运算的场景。
例如,下面的汇编代码展示了如何使用ADDSS 指令:
assembly
; 假设xmm0 中存储了一个单精度浮点数a
; 假设内存地址[address] 中也存储了一个单精度浮点数b
addss xmm0, [address] ; 将a 和b 相加,结果存储在xmm0 中
需要注意的是,为了充分发挥SSE 指令集的性能,通常需要结合其他指令和数据对齐技术来使用。
同时,现代的处理器和编译器也提供了更高级别的SIMD 指令集,如AVX、AVX2、AVX-512 等,这些指令集提供了更宽的数据路径和更多的操作功能。
汇编浮点运算指令集(转载)
汇编浮点运算指令集(转载)浮点执⾏环境的寄存器主要是8个通⽤数据寄存器和⼏个专⽤寄存器,它们是状态寄存器、控制寄存器、标记寄存器等8个浮点数据寄存器(FPU Data Register),编号FPR0 ~ FPR7。
每个浮点寄存器都是80位的,以扩展精度格式存储数据。
当其他类型数据压⼊数据寄存器时,PFU⾃动转换成扩展精度;相反,数据寄存器的数据取出时,系统也会⾃动转换成要求的数据类型。
8个浮点数据寄存器组成⾸尾相接的堆栈,当前栈顶ST(0)指向的FPRx由状态寄存器中TOP字段指明。
数据寄存器不采⽤随机存取,⽽是按照“后进先出”的堆栈原则⼯作,并且⾸尾循环。
向数据寄存器传送(Load)数据时就是⼊栈,堆栈指针TOP先减1,再将数据压⼊栈顶寄存器;从数据寄存器取出(Store)数据时就是出栈,先将栈顶寄存器数据弹出,再修改堆栈指针使TOP加1。
浮点寄存器栈还有⾸尾循环相连的特点。
例如,若当前栈顶TOP=0(即ST(0) = PFR0),那么,⼊栈操作后就使TOP=7(即使ST(0) = PFR7),数据被压⼊PFR7。
所以,浮点数据寄存器常常被称为浮点数据栈。
为了表明浮点数据寄存器中数据的性质,对应每个FPR寄存器,都有⼀个2位的标记(Tag)位,这8个标记tag0 ~ tag7组成⼀个16位的标记寄存器。
在计算机中,实数的浮点格式(Floating-Point Format)所⽰,分成指数、有效数字和符号位三个部分。
· 符号(Sign)——表⽰数据的正负,在最⾼有效位(MSB)。
负数的符号位为1,正数的符号为0。
· 指数(Exponent)——也被称为阶码,表⽰数据以2为底的幂。
指数采⽤偏移码(Biased Exponent)表⽰,恒为整数。
· 有效数字(Significand)——表⽰数据的有效数字,反映数据的精度。
有效数字⼀般采⽤规格化(Normalized)形式,是⼀个纯⼩数,所以也被称为尾数(Mantissa)、⼩数或分数(Fraction)。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
fsubr st(num),st ;计算 st 减 st(num)的值,用差值替换 st(num)
fsubr st,st(num) ;计算 st(num)减 st 的值,用差值来替换 st
fsubr memory(real) ;计算存储器中的实型数值减 st 的值,用差值替换 st
fisubr memory(integer) ;计算存储器中的整型数值减 st 的值;用差值替换 st
;///
;////////////////////////////////////////////////////////////////////////////
;助记符 操作数
功能
fcom (none)
;比较 st 和 st(1)
fcom st(num)
;比较 st 和 st(num)
fcom memory(real) ;比较 st 和存储器中的实型数
fmul st,st(num) ;将 st 和 st(num)相乘;用乘积来替换 st
fmul memory(real) ;将 st 和存储器中的实型数相乘;用乘积来替换 st
fimul memory(integer) ;将 st 和存储器中的整型数相乘,用乘积来替换 st
fmulp st(num),st ;将 st(num)和 st 相乘;乘积来替换 st(num);并将 st 出栈
汇编语言浮点数指令集
;****************************************************************
****************
;*
浮点数指令集
;****************************************************************
ficom memory(integer) ;比较 st 和存储器中的整型数
ftst (none)
;比较 st 和 0.0
fcomp (none)
;比较 st 和 st(1);然后出栈
fcomp st(num)
;比较 st 和 st(num);然后出栈
fcomp memory(real) ;比较 st 和存储器中的实型数;然后出栈
;1.0 压人堆栈
fldz (none)
;0.0 压人堆栈
fldpi (none)
;Π(pi)压人堆栈
fldl2e (none)
;log2(e)压人堆栈
fldl2t (none)
;log2(10)压人堆栈
fldlg2 (none)
;log10(2)压人堆栈
fldln2 (none)
;loge(2)压人堆栈
fsubrp st(num),st ;计算 st 减 st(num)的值,用差值替换 st(num);将 st 出栈
;//////////////////////////////////////////////////////////////////////////////
;///
;///
浮点型除法指令
finit (none)
;初始化浮点型单元,并清空 8 个寄存器的内容
;////////////////////////////////////////////////////////////////////////////////
;/////
;////
浮点数数据存储指令
;////
;///////////////////////////////////////////////////////////////////////////////
;////
;///
浮点型乘法指令
;///
;//////////////////////////////////////////////////////////////////作数
功能
fmul (none)
;将 st 和 st(1)出栈;并将它们的值相乘;乘积人栈
fmul st(num),st ;将 st(num)和 st 相乘;用乘积来替换 st(num)
fiadd memory(integer) ;将 st 和存储器中的整型数相加,用和替换 st
faddp st(num),st ;将 st(num)和 st 相加,用和来替换 st(num),将 st 出栈
;//////////////////////////////////////////////////////////////////////////////
fcomp memory(integer) ;比较 st 和存储器中的整型数;然后出栈
fcompp (none)
;比较 st 和 st(1);然后两次出栈
;////////////////////////////////////////////////////////////////////////////
;助记符 操作数
功能
fst st(num)
;复制 st 的值来替换 st(num)的内容;只有 st(num)是受到影响
fstp st(num)
;复制 st 的值来替换 st(num)的内容;st 出栈
fst memory(real) ;复制 st 的值为实型数,存入存储器;堆栈不受影响
fstp memory(real) ;复制 st 的值为实型数,存入存储器;st 出栈
;互换 st 和 st(1)
fxch st(num)
;互换 st 和 st(num)
;///////////////////////////////////////////////////////////////////////////////
;////
;///
浮点型加法指令
;///
;//////////////////////////////////////////////////////////////////////////////
;助记符 操作数
功能
fsub (none)
;将 st 和 st(1)出栈,计算 st(1)减 st 的值;将差入栈
fsub st(num),st ;计算 st(num)减 st 的值;用差值替换 st(num)
fsub st,st(num) ;计算 st 减 st(num)的值;用差值来替换 st
fsub memory(real) ;计算 st 减存储器中的实型数的值;用差值来替换 st
fstcw memory WORD ;复制控制字寄存器到存储器
fldcw memory WORD ;复制存储器字到控制字寄存器
****************
;////////////////////////////////////////////////////////////////////////////////
;////
;////
浮点数载入指令
;////
;///////////////////////////////////////////////////////////////////////////////
fisub memory(integer) ;计算 st 减存储器中的整型数的值;用差值替换 st
fsubp st(num),st ;计算 st(num)减 st 的值;用差值替换 st(num);将 st 出栈
fsubr (none)
;将 st 和 st(1)出栈;计算 st 减 st(1)的值;将差值入栈
功能 ;st := |st|(绝对值) ;st := -st(相反数) ;对 st 取整 ;用 st 的平方根来替换 st
;/////////////////////////////////////////////////////////////////////////////
;///
;///
浮点型比较指令
;///
;///
附加的浮点型指令
;///
;/////////////////////////////////////////////////////////////////////////////
;助记符 操作数 fabs (none) fchs (none) frndint (none) fsqrt (none)
;助记符 操作数
功能
fld memory(real) ;将存储器中的实型压人堆栈
fild memory(integer) ;将存储器的整型数值转化为浮点数并压人堆栈
fbld memory(BCD) ;将存储器的 BCD 码转化为浮点数并压人堆栈
fld st(num)
;将浮点型寄存器中的数值压入堆栈
fld1 (none)
;助记符 操作数
功能
fadd (none)
;将 st 和 st(1)出栈;将两个值相加;并将它们的和入栈
fadd st(num),st ;将 st(num)和 st 相加;用和替换 st(num)
fadd st,st(num) ;将 st 和 st(num)相加;用和替换 st
fadd memory(real) ;将 st 和存储器中的实型数相加;用和替换 st
fist memory(integer) ;复制 st 的值,并转换为整型数存入存储器
fistp memory(integer) ;复制 st 的值,并转换为整型数存入存储器;st 出栈
fbstp memory(BCD) ;复制 st 的值,并转换为 BCD 码存入存储器;st 出栈
fxch (none)
;///
;///
混合浮点型指令
;///
;////////////////////////////////////////////////////////////////////////////