AT&T学习笔记汇编之数学处理
来源:互联网 发布:windows 8的记事本 编辑:程序博客网 时间:2024/06/05 00:26
溢出
movl $0 , %ebx
movb $190 , %bl
movb $100 , %al
addb %al , %bl
jc over
movl $1 , %eax
int $0x80
over:
movl $1 , %eax
movl $0 , %ebx
int $0x80
处理带符号数,进位标志是没有用处的。结果过大与小于0都回设置它。
jo over
adc指令 带进位加法
sbb指令 带借位减法
dec destination
inc destination
mul无符号乘法
mul source 8 16 32位 或内存 位置
8 目标操作数 AL 目标位置 AX
16 AX DX:AX
32 EAX EDX:EAX
imul无符号整数 不使用目标的最高有效位。
imul source 8 16 32 eax目标操作数
imul source , destination
source 16 32
destination 必须是16或32位寄存器。最好不要溢出。
允许指定把乘法操作结果放在哪个位置。
imul multiplier , source , destination
multiplier立即值 source 16 32寄存器或内存 dest 必须是通用寄存器
imull
divn divisor(除数) 被除数ax dx:ax edx:eax
商 al ax eax
余数 ah dx edx
sal向左算术移位
shl向左逻辑移位
sal dest 移1位
sal %cl , dest cl位
sal shifter , dest shifter位
sar 填补
shr 清空移位造成的空位
循环移位
rol 向左
ror
rcl 向左循环移位,并且包含进位标志
rcr
bcd值
aaa 调整加法运算结果
aas
aam
aad
daa 调整ADD或者ADC指令的结果
das 调整SUB或者SBB指令的结果
布尔逻辑
and
not or xor
and source , destination
位测试 test 类似and指令但不存储结果
FPU寄存器堆栈
附加的FPU寄存器包括8个80位数据寄存器和3个16位寄存器,称为控制,状态,标记寄存器。
FPU的数据寄存器称为R0-R7,它们连接在一起形成一个堆栈,不同于内存中的堆栈,它们是
循环的。堆顶寄存器是在FPU的控制字寄存器中定义的称为ST(0)。其它为ST(1-7)
数据加载到FPU堆栈时,堆栈顶沿着8个寄存器向下移动。
FPU独立于主处理器。其不使用EFLAGS。
状态寄存器
0 非法操作异常标志
1 非规格化操作数异常标志
2 除数为0异常标志
3 溢出异常标志
4 下溢异常标志
5 精度异常标志
6 堆栈错误
7 错误汇总状态
8 条件代码位0(C0)
9 1
10 2
11-13 堆栈顶部指针
14 条件代码位3
15 FPU繁忙标志
fctrl
fstat
ftag
控制寄存器
0 非法操作异常掩码
1 非规格化操作数异常掩码
2 除数为0异常掩码
3 溢出异常掩码
4 下溢异常掩码
5 精度异常掩码
6-7 保留
8-9 精度控制
10-11 舍入控制
12 无穷大控制
13-15 保留
精度控制
00 单精度24有效位
01 未使用
10 双精度53有效位
11 扩展双精度64有效位
舍入控制
00 舍入到最近值
01 向下舍入
10 向上舍入
11 向0舍入
标记寄存器
用于标识8个80位数据寄存器中的值。使用16位寄存器标识每个FPU数据寄存器的内容(每个2位)。
0-15 R0-7
00 一个合法的双精度值
01 0值
10 特殊的浮点值
11 无内容
fadd
fdiv
fdivr
fmul
fsub
fsubr 反向浮点减法
每个指令都有6种变种
fadd source 内存中的32或64位值和ST0寄存器相加
fadd %st(x),%st(0) st(x)和st(0)相加,结果存至st0
fadd %st(0),%st(x)
faddp %st(0),%st(x) 结果存至st(x),并且弹出st(0)
faddp st(0)和st(1)相加,结果存储至st(1),且弹出st(0)
fiadd source 16或32位整数值和st(0)相加,结果存至st(0)
反向运算,目标值减去原值,并且把结果存至目标操作数位置。
fadds data1
fmull data1
fidiv data1
fsub %st , %st(1)
fsub %st(0) , %st(1)
fsub %st(1) , %st(0)
f2xm1 计算2的乘方(次数位ST0中的值)-1
fabs 计算st0中的绝对值
fchs 改变符号
fcos st0余弦
fpatan st0的部分反正切
fprem st0除以st1中的值的部分余数
fprem1 ieee部分余数
fptan st0部分正切
frndint st0值舍入到最近整数
fscale st0乘以2的st1次方
fsin 正弦
fsincos 正弦和余弦
fsqrt 平方根
fyl2x st1*log st0 2为基数
fyl2xp1 st1 * log (st1 + 1)
fcom 比较st0和st1寄存器值
fcom st(x) 比较ST0和另一个FPU寄存器
fcom source 比较st0寄存器和32或64位内存值
fcomp 比较st0和st1寄存器并弹出栈
fcomp st(x)
fcomp source
fcompp 比较st0和st1寄存器,并且两次弹出栈。
ftst 比较st0和0.0
比较结果
st0 > source c3 0 c2 0 c0 0
st0 < source 0 0 1
st0 = source 1 0 0
sahf 将ah寄存器第0 2 4 6 7位分别传送到进位、奇偶校验、对准、零和符号标志。不影响其它。
fstsw 和 sahf指令组合
把c0位传送到eflags进位标志
c2奇偶校验
c3 0标志
fcomi系列比较并把结果存放到EFLAGS寄存器 进位 奇偶 0
不可比较FPU寄存器和内存中的值
fcomi 比较st0和stx
fcomip
fucomi 在比较之前检查无序值
fucomip
fcomi eflags
st0 > stx zf 0 pf 0 cf 0
st0 < stx 0 0 1
st0 = stx 1 0 0
fcomv系列
fcomvb st0 < stx 则进行传送
fcomve
fcomvbe
fcomvu st0无序则进行传送
fcomvnb
fcomvne
fcomvnbe
fcomvnu 非无序则传送
fcomvxx source , destination dest是st0
保存或恢复FPU状态
fstenv 用于把FPU的环境存储到一个内存块中。
控制寄存器
状态寄存器
标记寄存器
FPU指令指针偏移量
FPU数据指针
FPU最后执行的操作码
不包括寄存器数据
FSAVE指令可以存储FPU寄存器数据
fstenv fldenv
fsave frstor
等待和非等待指令
fnclex 清空浮点异常标志
fnsave 把FPU状态保存到内存中
fnstcw 保存FPU控制寄存器
fnstenv 把FPU操作环境保存到内存中
fnstsw 把FPU状态寄存器保存到内存或者ax寄存器中
fstp
0 0
- AT&T学习笔记汇编之数学处理
- AT&T学习笔记汇编之函数
- AT&T学习笔记汇编之内核
- AT&T汇编学习笔记之数据类型
- AT&T汇编学习笔记之字符串
- AT&T学习笔记汇编之call
- AT&T学习笔记汇编之调用汇编库
- AT&T汇编学习笔记
- AT&T学习笔记汇编之控制指令
- AT&T汇编学习笔记之使用文件
- AT&T学习笔记汇编之高级特性
- AT&T学习笔记汇编之内联c语言
- AT&T 汇编学习
- AT&T 汇编学习
- AT&T汇编处理字符串
- AT&T汇编 基本数学功能
- AT&T汇编leave学习
- AT&T格式汇编学习
- AT&T学习笔记汇编之内联c语言
- 平易近人、兼容并蓄——Spark SQL 1.3.0概览
- AT&T学习笔记汇编之内核
- 关于java的集合类,以及HashMap中Set的用法
- 第四周项目4-指向学生类的指针
- AT&T学习笔记汇编之数学处理
- Android TV 开发笔记一:环境搭建
- Set集合重复元素的判断
- AT&T汇编学习笔记之数据类型
- AT&T汇编学习笔记之字符串
- HtmlUnit测试入门
- 提高MySQL数据库性能
- AT&T学习笔记汇编之调用汇编库
- 第五周程序阅读(6)