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