首页 | 新闻 | 新品 | 文库 | 方案 | 视频 | 下载 | 商城 | 开发板 | 数据中心 | 座谈新版 | 培训 | 工具 | 博客 | 论坛 | 百科 | GEC | 活动 | 主题月 | 电子展
返回列表 回复 发帖

GNU汇编总结 05

GNU汇编总结 05

# 五,控制流程
   
    ################################################################################################
   
    无条件跳转:
   
    1, 跳转
   
    jmp    location 其中location为要跳转到的内存地址, 在汇编中为定义的标签
   
    2,调用
   
    调用指令分为两个部分:
   
    1, 调用call address 跳转到指定位置
   
    2, 返回指令ret, 它没有参数紧跟在call指令后面的位置
   
    执行call指令时,它把EIP的值放到堆栈中, 然后修改EIP以指向被调用的函数地址, 当被调用
   
    函数完成后, 它从堆栈获取过去的EIP的值, 并把控制权返还给原始程序。
   
    3,中断
   
    由硬件设备生成中断。 程序生成软件中断
   
    当一个程序产生中断调用时, 发出调用的程序暂停, 被调用的程序接替它运行, 指令指针被转移到
   
    被调用的函数地址, 当调用完成时使用中断返回指令可以返回调原始程序。
   
    条件跳转:
   
    条件跳转按照EFLAGS中的值来判断是否该跳转, 格式为:
   
    jxx address, 其中xx是1-3个字符的条件代码, 取值如下:
   
    a        大于时跳转
   
    ae       大于等于
   
    b        小于
   
    be       小于等于
   
    c        进位
   
    cxz      如果CX寄存器为0
   
    ecxz     如果ECS寄存器为0
   
    e        相等
   
    na       不大于
   
    nae      不大于或者等于
   
    nb       不小于
   
    nbe      不小于或等于
   
    nc       无进位
   
    ne       不等于
   
    g        大于(有符号)
   
    ge       大于等于(有符号)
   
    l        小于(有符号)
   
    le       小于等于(有符号)
   
    ng       不大于(有符号)
   
    nge      不大于等于(有符号)
   
    nl       不小于
   
    nle      不小于等于
   
    no       不溢出
   
    np       不奇偶校验
   
    ns       无符号
   
    nz       非零
   
    o        溢出
   
    p        奇偶校验
   
    pe       如果偶校验
   
    po       如果奇校验
   
    s        如果带符号
   
    z        如果为零
   
    条件跳转不支持分段内存模型下的远跳转, 如果在该模式下进行
   
    程序设计必须使用程序逻辑确定条件是否存在, 然后实现无条件
   
    跳转, 跳转前必须设置EFLAGS寄存器
   
    ################################################################################################
   
    # 六,数字
   
    ################################################################################################
   
    IA-32平台中存储超过一字节的数都被存储为小尾数的形式但是把数字传递给寄存器时, 寄存器里面保存是按照大尾数
   
    的形式存储
   
    把无符号数转换成位数更大的值时, 必须确保所有的高位部分都被设置为零
   
    把有符号数转换成位数更大的数时:
   
    intel 提供了movsx指令它允许扩展带符号数并保留符号, 它与movzx相似, 但是它假设要传送的字节是带符号数形式
   
    浮点数:
   
    fld    指令用于把浮点数字传送入和传送出FPU寄存器, 格式:
   
    fld source
   
    其中source可以为32 64或者80位整数值
   
    IA-32使用FLD指令用于把存储在内存中的单精度和双精度浮点值FPU寄存器堆栈中, 为了区分这两种长度GNU汇编器使用
   
    FLDS加载单精度浮点数, FLDL加载双精度浮点数
   
    类似FST用于获取FPU寄存器堆栈中顶部的值, 并且把这个值放到内存位置中, 对于单精度使用FSTS, 对于双精度使用FSTL
返回列表