GNU汇编总结1.

http://bbs.ednchina.com/BLOG_ARTICLE_379381.HTM


# 一, IA-32 硬件特性                                               
################################################################################################


寄存器:
1, 通用寄存器, 用于存放正在处理的数据
     EAX    用于操作数和结果数的累加器
     EBX    指向数据内存断中的数据的指针
     ECX    字符串和循环操作的计数器
     EDX    IO指针
     EDI    用于字符串操作的目标的数据指针
     ESI    用于字符串操作的源的数据指针
     ESP    堆栈指针
     EBP    堆栈数据指针
   
     其中寄存器EAX, EBX, ECX, EDX又可以通过16位和8位寄存器名称引用
     如EAX, AX 引用EAX低16位, AL 引用EAX低8位, AH 引用AL之后的高8位
   
   
   
2, 段寄存器:
     IA-32平台允许使用3中内存模型: 平坦内存模式    分段内存模式    实地址模式
   
     平坦内存: 把全部的系统内存表示为连续的地址空间, 通过线性地址的特定地址
               访问内存位置.
   
     分段内存: 把系统内存划分为独立的段组, 通过位于寄存器中的指针进行引用. 每
               个段用于包含特定类型的数据。 一个段用于包含指令码, 另一个段包
               含数据元素, 第三个段包含数据堆栈。
               段中的内存位置是通过逻辑地址引用的, 逻辑地址是由段地址加上偏移
               量构成, 处理器把逻辑地址转换为相应的线性地址以便访问。
           
             
               段寄存器:
               CS    代码段
               DS    数据段
               SS    堆栈段
               ES    附加段指针
               FS    附加段指针
               GS    附加段指针
             
               每个段寄存器都是16位的, 包含指向内存特定段起始位置的指针,程序不能
               显示加载或改变CS寄存器, DS, ES, FS, GS都用于指向数据段, 通过4个独立
               的段, 程序可以分隔数据元素, 确保他们不会重叠, 程序必须加载带有段的
               正确指针值的数据段寄存器, 并且使用偏移值引用各个内存的位置。
               SS段寄存器用于指向堆栈段, 堆栈包含传递给函数和过程的数据值。
    
     实地址:     如果实地址模式, 所有段寄存器都指向线性0地址, 并且都不会被程序改动, 
               所有的指令码 数据元素 堆栈元素 都是通过他们的线性地址直接访问的。
             
      
      
3, 指令指针寄存器
      是EIP寄存器, 它跟踪要执行程序的下一条指令代码, 应用程序不能修改指令指针本身,不
      能指定内存地址把它拖放EIP寄存器中,相反必须通过一般的跳转指令来改变预存取缓存的
      下一条指令。
    
      在平坦内存模型中, 指令指针包含下一条指令码的线性地址, 在分段模型中指令指针包含
      逻辑地址指针, 通过CS寄存器的内存引用。
    
    
    
4,    控制寄存器
      CRO    控制操作模式 和 处理器当前状态的系统标志
      CR1    当前没有使用
      CR2    内存页面错误信息
      CR3    内存页面目录信息
      CR4    支持处理器特性和说明处理器特性能力的标志
    
      不能直接访问控制寄存器, 但是能把控制寄存器中的值传递给通用寄存器,如果必须改动控制
      寄存器的标志, 可以改动通用寄存器的值, 然后把内容传递给控制寄存器。
    
    
    
    
    
标志:
      IA-32使用单一的寄存器来包含一组状态控制和系统标志, EFLAGS寄存器包含32位标志信息
    
1, 状态标志
      标志                  位                          说明
      CF                    0                           进位标志, 如果无符号数的数学操作产生最高有效位的进位或者借位, 此时值为1
      PF                    2                           奇偶校验标志, 用于表明数学操作的结果寄存器中的是否包含错误数据
      AF                    4                           辅助进位标志, 用于二进制编码的10进制(BCD)的数学操作中, 如果用于运算的
                                                    寄存器的第三位发生进位或借位, 该值为1
      ZF                    6                           0标志, 如果操作为0, 则该值为1
      SF                    7                           符号标志, 设置为结果的最高有效位, 这一位是符号位表明结果是正值还是负值
      OF                    11                          溢出标志

2, 控制标志    
      当前只定义了一个控制标志DF即方向标志, 用于控制处理器处理字符串的方式
      如果设置为1, 字符串指令自动递减内存地址以便到达字符串中的下一字节。
      反之。

3, 系统标志
      标志                  位                          说明
      TF                    8                           陷阱标志, 设置为1时启用单步模式, 在单步模式下处理器每次只执行一条命令。
      IF                    9                           中断使能标志, 控制处理器如响应从外部源接收到的信号。
      IOPL                  12和13                      IO特权级别标志, 表明当前正在运行任务的IO特权级别, 它定义IO地址空间的
                                                    特权访问级别, 该值必须小于或者等于访问I/O地址空间的级别; 否则任何访问
                                                    IO空间的请求都会被拒绝!
      NT                    14                          嵌套任务标志控制当前运行的任务是否连接到前一个任务, 它用于连接被中断
                                                    和被调用的任务.
      RF                    16                          恢复标志用于控制在调试模式中如何响应异常。
      VM                    17                          虚拟8086模式, 表明处理器在虚拟8086模式中而不是保护模式或者实模式。
      AC                    18                          对准检查标志, 用于启用内存引用的对准检查
      VIF                   19                          虚拟中断标志, 当处理器在虚拟模式中操作时, 该标志起IF标志的作用.
      VIP                   20                          虚拟中断挂起标志, 在虚拟模式操作时用于表示一个中断正在被挂起。
      ID                    21                          表示CPU是否支持cpuid指令, 如果处理器能够设置或者清零这个标志, 表示
                                                    处理器支持该指令。
                                                  




                                                  
################################################################################################
# 二,GNU汇编工具系列                                      
################################################################################################
1, 二进制工具系列
      addr2line           把地址转换成文件名或者行号
    
      ar                  创建 修改或者展开文件存档
    
      as                  把汇编语言代码汇编成目标代码
          常用选项:
          -a          -> 指定输出中包含那些清单
          -D          -> 包含它用于向下兼容 但是被忽略
          --defsym    -> 在汇编代码之前定义符号和值
          -f          -> 快速汇编跳过注释和空白
          --gstabs    -> 包含每行源代码的调试信息
          --gstats+ -> 包含gdb专门的调试信息
          -I          -> 指定包含文件的目录
          -J          -> 不警告带符号溢出
          -L          -> 在符号表中保存本地符号
          -o          -> 给定输出目标名
          -R          -> 把数据段合并进文本段
          --statistics -> 显示汇编使用的最大空间和总时间
          -v          -> 显示as的版本号
          -W          -> 不显示警告信息      
    
      c++filt             还原c++符号的过滤器
    
      gprof               显示程序简档信息的程序
    
      ld                  把目标代码文件转换成可执行文件的转换器
          常用选项:
          -d          -> 指定目标代码输入文件的格式
          -Bstatic    -> 只使用静态库
          -Bdynamic -> 只使用动态库
          -Bsymbolic-> 把引用捆绑到共享库中的全局符号
          -c          -> 从指定的命令文件读取命令
          -cref       -> 创建跨引用表
          -defsym     -> 在输出文件中创建指定的全局符号
          -demangle -> 在错误消息中还原符号名称
          -e          -> 使用指定的符号作为程序的初始执行点
          -E          -> 对于elf文件把所有的符号添加到动态符号表
          -share      -> 创建共享库
          -Ttext      -> 使用指定的地址作为文本段的起始点
          -Tdata      -> 使用指定的地址作为数据段的起始点
          -Tbss       -> 使用指定的地址作为bss段的起始点
          -L          -> 把指定的路径添加到库搜索清单
          -O          -> 生成优化的输出文件
          -o          -> 指定输出名
          -oformat    -> 指定输出文件的二进制格式
          -R          -> 从指定的文件读取符号和地址
          -rpath      -> 把指定的位置添加到运行时库搜索路径
          -rpath-link-> 指定搜索运行时共享库的路径
          -X          -> 删除本地所有临时符号
          -x          -> 删除本地所有符号
    
      nm                  列出目标文件中的符号
    
      objcopy             复制或翻译目标文件
    
      objdump             显示来自目标文件的信息
    
      ranlib              生成存档文件内容的索引
    
      readelf             按照elf格式显示目标文件信息
    
      size                列出目标文件或者存档文件的段长度
    
      strings             显示目标文件中可打印字符串
    
      strip               丢弃符号
    
      windres             编译Microsoft Windows资源文件  
    
2, GNU编译器  
     gcc
     常用选项:
          -c     编译或者汇编代码但不进行连接
          -S     编译后停止但不进行汇编
          -E     预处理后停止但不进行编译
          -o     指定输出文件名
          -v     显示每个编译阶段使用的命令
          -std 指定使用的语言标准
          -g     生成调试信息
          -pg    生成gprof制作简档要使用的额外代码
          -O     优化可执行代码
          -W     设置编译器警告级别
          -I     指定包含文件清单
          -L     指定库文件目录
          -D     预定义源代码中使用的宏
          -U     取消任何定义了的宏
          -f     指定控制编译器行为的选项
          -m     指定与硬件相关的选项


3, GNU调试程序
     gdb
     常用选项:
          -d       指定远程调试时串行接口的线路速度  
          -batch 以批处理模式运行
          -c       指定要分析的核心转储文件
          -cd      指定工作目录
          -d       指定搜索源文件的目录
          -e       指定要执行的文件
          -f       调试时以标准格式输出文件名和行号
          -q       安静模式
          -s       指定符号的文件名
          -se      指定符号和要执行的文件名
          -tty     设置标准输出和输入设备
          -x       从指定的文件执行gdb命令
   
     由于gnu调试时忽略开始处断点, 需要在开始标签处执行一个空指令
     如:
     .globl _start
     _start:
     nop
     此时断点可以设置成 break *_start+1
     查看寄存器状态info registers
     使用print命令查看特定寄存器或者变量的值, 加上修饰符可以得到不同的输出格式:
     print/d    显示十进制数字
     print/t    显示二进制数字
     print/x    显示16进制数字
     使用x命令可以查看特定内存的值:
     x/nyz
     其中 n为要显示的字段数
     y时输出格式, 它可以是:
     c 用于字符, d用于十进制, x用于16进制
     z是要显示的字段长度, 它可以是:
     b用于字节, h用于16字节, w用于32位字
     如:
     x/42cb    用于显示前42字节




注:出处:http://tb.blog.csdn.net/TrackBack.aspx?PostId=1483505


再注:之所以转本文.主要是怕这么好的东西哪天一不小心找不到了,所以先帮自己放在这里.还是谢谢写这篇文章的兄弟.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值