05 汇编中while

汇编需要考虑的四个要素

- 寄存器与寄存器堆  
- 条件码
- 存储器
- 指令寄存器

条件码 :上一条指令运行结果反应在条件码中

- CF carry clag 进位
    - 用于检测无符号整数运算溢出
- ZF zero flag   等于零
- SF sign flag  符号位
- OF overflow flag 溢出位
    - 补码运算的溢出(带符号整数运算)


算术和逻辑操作指令都会修改条件码的值,但是leal指令不会修改条件码的值。
条件码寄存器不能直接读取,有三种方法:


    set    
    jump:根据条件码进行跳转
    cmov:条件传送指令,根据条件码决定是否进行mov操作

寻址模式

间接寻址:movl (%ecx),%eax 

基址+偏移量寻址: movl 8(%ebp),%edx  

变址寻址:D(Rb,Ri,S)  mem[Rb + S*Ri +  D]
    D:常量
    Rb;基址寄存器
    Ri:索引寄存器  %esp不作为索引寄存器,一般%ebp也不用
    S;比例因子1,2,4,or 8

     0x8(%edx,%ecx,4)

循环

  1. 任何循环转换成goto

  2. For – > While —>Do While ---->if Goto

     for (Init : Test : Update)
         body
         ||
         ||
    
     Init;
     while (Test){
         Body
         Update;
     }
         ||
         ||
    
    
     Init;
     if (!Test)
     goto done;
     do{
         Body
         Update;
     }While (Test)
     done:
    
         ||
         ||
    
     Init;
     if (!Test)
         goto done;
     loop:
         Body
         Update;
         if (Test)
             goto loop;
         done;
    

Switch语句

1. 跳转表 Jump Table
   1. jmp *.L62(,%edx,4) *代表jmp到返回地址上去 %edx表示判断的数值,4表示32下地址的长度  L62表示跳转表的地址

2.二叉树 if - else 当判断过于稀疏  如 1   7777  999

微体系结构

处理器流水线 5级流水
    IF --   RD ---- ALU----MEM ---- WB

流水线的引出的--条件引出的性能损失 ----->解决方案,使用条件转移指令代理条件跳转---->引出问题,是否会改变全局变量,计算量是否太大

条件跳转暂时解决方案

  1. Branch Prediction技术,记录相关条件跳转次数,根据历史信息来预测你的行为

函数返回值32位存在eax中 64位在rax中

GCC使用–>产生的是AT&T的汇编格式

gcc -O2  -S code.c -m32 

汇编相关trick

注:立即数,在汇编语言中有三种数,内存,寄存器,立即数,立即数就是常量,可以直接使用
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值