首页
社区
课程
招聘
汇编翻译为C代码可以吗?
发表于: 2010-12-8 11:05 5266

汇编翻译为C代码可以吗?

2010-12-8 11:05
5266
本人最近在弄汇编翻译为C代码的程序,有点类似F5,但是有些问题没弄懂,请各位大侠帮助下。
假设源代码为 while (a && b) 那么程序流程应该是这样

<─┐
Run │
a─┐│
b─┼┘
<─┘

假设源代码为 if ( a || b ) 那么程序流程应该是这样

a─┐
b─┼┐
<─┘│
Run  │
<──┘

但是下面的流程,我无论如何也想不到相对应的C代码

<─── ┐
Run      │
a─┐    │
b─┼┐  │
c─┼┼─┤
<─┘│  │
d──┼─┘
<──┘

是否该汇编是无法转化为C语言的呢?

[课程]Linux pwn 探索篇!

收藏
免费 0
支持
分享
最新回复 (11)
雪    币: 2384
活跃值: (766)
能力值: (RANK:410 )
在线值:
发帖
回帖
粉丝
2
那个大概是这样的吧:
do
{
  do
  {
    if (a)
    {
         ......
     }else if (b)
        break;
    }while (c)
    break;
}while (d);
2010-12-8 11:49
0
雪    币: 1231
活跃值: (41)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
这也是个很好的思路,不过 在判断 C 条件之后符合就Run 不符合就 break; 也就是跳出循环不在判断 break;也就是说永远也不会执行到 d 所以应该是错误的。如果按你的思路,应该是这样,不过要增加一个GOTO
do
{
  do
  {
     Run

     if (a)
     {
        break;
     }
      else if (b)
     {
         goto LABLE1;
      }
   }while (c)
}while (d);
LABLE1:

还有更简化的方案吗?
2010-12-8 12:10
0
雪    币: 2384
活跃值: (766)
能力值: (RANK:410 )
在线值:
发帖
回帖
粉丝
4
是的,你的表示方法才对。
2010-12-8 12:18
0
雪    币: 1231
活跃值: (41)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
经过你的启发我发现了不能直接转为C语言的原因了,一个break只能跳出一重循环,不能跳出两重循环,所以也只有GOTO了。
2010-12-8 12:19
0
雪    币: 2384
活跃值: (766)
能力值: (RANK:410 )
在线值:
发帖
回帖
粉丝
6
是的,C语言中没有跳出两重循环的语句,只有使用goto或者如果d之后是函数返回的话也可以直接使用return直接退出。
2010-12-8 12:24
0
雪    币: 107
活跃值: (12)
能力值: ( LV8,RANK:130 )
在线值:
发帖
回帖
粉丝
7
c 语言写的代码,可以翻译为C,
不是c 语言的代码,例如直接用汇编写的代码,则不一定能翻译成C.
所以说,C 语言的代码结构只是程序结构的一个子集。 并不是完备的。
汇编是完备的,它可以做任何事情,例如它可以直接操纵I/O 而C 不能,同时它可以是无结构的。
2010-12-8 12:42
0
雪    币: 83
活跃值: (40)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
8
记得好像一本C语言的书(忘了是哪个了)上就专门说过goto语句,一般不推荐使用,滥用goto跳转会使程序逻辑混乱,
但是从C语言的编译器一直到C++、C#都是支持goto语句的,最新的VS2010都支持,并没有把goto废除,
因为某些特殊情况下不用goto是很复杂的,偶尔用一下goto有时候能使程序简化,
书上举的例子好像是3重循环,要从里面跳出2重循环,
2010-12-8 13:38
0
雪    币: 108
活跃值: (27)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
9
实在处理不了的就用asm("");
2010-12-8 13:42
0
雪    币: 1231
活跃值: (41)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
10
谢谢各位大牛了,结贴。
2010-12-8 13:45
0
雪    币: 83
活跃值: (40)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
11
C语言可以内嵌汇编,或者还可以直接用shellcode,
你去看linux的源代码,连操作系统都能写还有什么是不能做到的?
2010-12-8 13:47
0
雪    币: 322
活跃值: (113)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
12
关注一下!!
2010-12-8 14:02
0
游客
登录 | 注册 方可回帖
返回
//