RE4B 13章读书笔记

从13.2小节开始,本小节主要是讲如果 case太多,无法用jne/je跳转怎么办?

这里用了一组计算技巧来进行地址跳转,

jmp         dword ptr $LN11@f[ecx*4]

假如ecx中存的是2,则   dword ptr $LN11@f[ecx*4] =$LN11@f[8],对应的是$LN11跳转表中

$LN4@f的地址。用ollydbg调试的时候,可以看到转移表在地址中(data字段)占了一块连续地址,

13.3 如果是多个case对应一个分支的话,那就是需要一个索引表来统一组织case,需要一个跳转表来跳转。

movzx eax,byte prt $ln10@f[eax];       movzx,较小值复制到较大值,然后0填充。

jmp dword ptr $ln11@f[eax*4]

// cl 1.15.1-switch.c /Fa1.15.1-switch.asm
// cl 1.15.1-switch.c /Ox /Fa1.15.1-switch-optimized.asm
#include <stdio.h>

void f(int a){
    switch(a){
        case 0:
            printf("zero\n");
            break;
        case 1:
            printf("one\n");
            break;
        case 2:
            printf("two\n");
            break;
        case 3:
            printf("three\n");
            break;
        case 4:
            printf("four\n");
            break;
        default:
            printf("Unknow Number\n");
            break;
    }
};

int main(){
    f(2); 
    return 0;
}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值