Board logo

标题: GNU汇编总结 06 [打印本页]

作者: samwalton    时间: 2013-9-28 14:00     标题: GNU汇编总结 06

七,基本数学运算
   
    ################################################################################################
   
    1, 加法
   
    ADD    source, destination     把两个整数相加
   
    其中source可以是立即数内存或者寄存器, destination可以是内存或者寄存器, 但是两者不能同时都是内存位置
   
    ADC    和ADD相似进行加法运算, 但是它把前一个ADD指令的产生进位标志的值包含在其中, 在处理位数大于32(如64)
   
    位的整数时, 该指令非常有用
   
    2, 减法
   
    SUB    source, destination     把两个整数相减
   
    NEG    它生成值的补码
   
    SBB 指令, 和加法操作一样, 可以使用进位情况帮助执行大的无符号数值的减法运算。 SBB在多字节减法操作中利用
   
    进位和溢出标志实现跨数据边界的的借位特性
   
    3,递增和递减
   
    dec destination    递减
   
    inc destination    递增
   
    其中dec和inc指令都不会影响进位标志, 所以递增或递减计数器的值都不会影响程序中涉及进位标志的其他任何运算
   
    4, 乘法
   
    mul    source 进行无符号数相乘
   
    它使用隐含的目标操作数, 目标位置总是使用eax的某种形式, 这取决与源操作数的长度, 因此根据源操作数的长度,
   
    目标操作数必须放在AL, AX, EAX中。 此外由于乘法可能产生很大的值, 目标位置必须是源操作数的两倍位置, 源为
   
    8时, 应该是16, 源为16时, 应该为32, 但是当源为16位时intel为了向下兼容, 目标操作数不是存放在eax中, 而
   
    是分别存放在DX:AX中, 结果高位存储在DX中, 地位存储在AX中。对于32位的源, 目标操作数存储在EDX:EAX中, 其中
   
    EDX存储的是高32位, EAX存储的是低32位
   
    imul source 进行有符号数乘法运算, 其中的目标操作数和mul的一样
   
    imul source, destination 也可以执行有符号乘法运算, 但是此时可以把目标放在指定的位置, 使用这种格式的缺陷
   
    在与乘法的操作结果被限制为单一目标寄存器的长度。
   
    imul multiplier, source, destination
   
    其中multiplier是一个立即数, 这种方式允许一个值与给定的源操作数进行快速的乘法运算, 然后把结果存储在通用
   
    寄存器中
   
    5, 除法
   
    div divisor     执行无符号数除法运算
   
    除数的最大值取决与被除数的长度, 对于16位被除数 ,除数只能为8位, 32或64位同上
   
    被除数             被除数长度                商                   余数
   
    AX                   16位                   AL                   AH
   
    DX:AX                32位                   AX                   DX
   
    EDX:EAX              64位                   EAX                  EDX
   
    idiv divisor    执行有符号数的除法运算, 方式和div一样
   
    6, 移位
   
    左移位:
   
    sal     向左移位
   
    sal destination     把destination向左移动1位
   
    sal %cl, destination 把destination的值向左移动CL寄存器中指定的位数
   
    sal shifter, destination 把destination的值向左移动shifter值指定的位数
   
    向左移位可以对带符号数和无符号数执行向左移位的操作, 移位造成的空位用零填充, 移位造成的超过数据长度的任何位
   
    都被存放在进位标志中, 然后在下一次移位操作中被丢弃
   
    右移位:
   
    shr向右移位
   
    sar向右移位
   
    SHR指令清空移位造成的空位, 所以它只能对无符号数进行移位操作
   
    SAR指令根据整数的符号位, 要么清空, 要么设置移位造成的空位, 对于负数, 空位被设置为1
   
    循环移位:
   
    和移位指令类似, 只不过溢出的位被存放回值的另一端, 而不是丢弃
   
    ROL           向左循环移位
   
    ROR           向右循环移位
   
    RCL           向左循环移位, 并且包含进位标志
   
    RCR           向右循环移位, 并且包含进位标志
   
    7, 逻辑运算
   
    AND    OR    XOR
   
    这些指令使用相同的格式:
   
    and source, destination
   
    其中source可以是8位 16 位或者32位的立即值 寄存器或内存中的值, destination可以是8位 16 位或者
   
    32位寄存器或内存中的值, 不能同时使用内存值作为源和目标。 布尔逻辑功能对源和目标执行按位操作。
   
    也就是说使用指定的逻辑功能按照顺序对数据的元素的每个位进行单独比较。
   
    NOT指令使用单一操作数, 它即是源值也是目标结果的位置
   
    清空寄存器的最高效方式是使用OR指令对寄存器和它本身进行异或操作。当和本身进行XOR操作时, 每个设置为
   
    1的位就变为0, 每个设置为0的位也变位0。
   
    位测试可以使用以上的逻辑运算指令, 但这些指令会修改destination的值, 因此intel提供了test指令, 它不
   
    会修改目标值而是设置相应的标志




欢迎光临 电子技术论坛_中国专业的电子工程师学习交流社区-中电网技术论坛 (http://bbs.eccn.com/) Powered by Discuz! 7.0.0