免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 872 | 回复: 0
打印 上一主题 下一主题

GNU汇编总结4 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2009-05-29 15:04 |只看该作者 |倒序浏览

# 七,基本数学运算                                          
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指令, 它不
     会修改目标值而是设置相应的标志
   
   
# 八,字符串处理                                          
1, 传送字符串
movs 有三种格式
movsb     传送单一字节
movsw     传送一个字
movsl     传送双字
movs指令使用隐含的源和目的操作数, 隐含的源操作数是ESI, 隐含的目的操作数是EDI, 有两种方式加载内存地址到
ESI和EDI, 第一种是使用标签间接寻址 movl $output, %ESI, 第二种是使用lea指令, lea指令加载对象的地址到指定
的目的操作数如lea output, %esi, 每次执行movs指令后, 数据传送后ESI和EDI寄存器会自动改变,为另一次传送做
准备, ESI和EDI可能随着标志DF的不同自动递增或者自动递减, 如果DF标志为0则movs指令后ESI和EDI会递增, 反之会
递减, 为了设置DF标志, 可以使用一下指令:
CLD    将DF标志清零
STD    设置DF标志
2,rep前缀
     REP 指令的特殊之处在与它不执行什么操作, 这条指令用于按照特定次数重复执行字符串指令, 有ECX寄存器控制,
     但不需要额外的loop指令, 如rep movsl
   
     rep的其他格式:
     repe    等于时重复
     repne 不等于时重复
     repnz 不为零时重复
     repz    为零时重复
3, 存储和加载字符串
     LODS     加载字符串, ESI为源, 当一次执行完lods时会递增或递减ESI寄存器, 然后把字符串值存放到EAX中
   
     STOS     使用lods把字符串值加载到EAX后, 可以使用它把EAX中的值存储到内存中去:
             stos使用EDI作为目的操作数, 执行stos指令后, 会根据DF的值自动递增或者递减EDI中的值
4, 比较字符串
     cmps 和其他的操作字符串的指令一样, 隐含的源和目标操作数都为ESI和EDI, 每次执行时都会根据DF的值把
     ESI和EDI递增或者递减, cmps指令从目标字符串中减去源字符串, 执行后会设置EFLAGS寄存器的状态.
   
5,扫描字符串
     scas 把EDI作为目标, 它把EDI中的字符串和EAX中的字符串进行比较 ,然后根据DF的值递增或者递减EDI


本文来自ChinaUnix博客,如果查看原文请点:http://blog.chinaunix.net/u2/86876/showart_1947307.html
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP