[分享]从C语言到汇编,从汇编到C语言

电脑杂谈  发布时间:2020-01-29 05:05:09  来源:网络整理

汇编语言和c语言哪个难_c语言嵌入汇编_c语言对应汇编语句

帖子:145

-->

需要老大鉴定下贴子质量,呵

帖子:672

-->

@@:

inc eax

cmp dword pr [eax],12345678h

jne @B

这叫什么循环

帖子:202

-->

VC++的反汇编

帖子:103

-->

[QUOTE=fixfix;627937]@@:

inc eax

cmp dword pr [eax],12345678h

jne @B

这叫什么循环[/QUOTE]

这是一个空循环,在一些程序中拿来进行简单的“延时”;

unsigned i = 0;

while( i++ != 0x12345678 );// 空循环

帖子:28

-->

学习,谢谢!!!!!!!!!!!!!!!1

帖子:672

-->

c语言嵌入汇编_c语言对应汇编语句_汇编语言和c语言哪个难

我不赞同你的 延时 说法

我用来搜索特征码的

就叫他做 调试后的极端循环吧

你写的 while(i<0x12345678)

也不是我写的代码while写法

.while (dword ptr [eax]!=12345678h)

inc eax

.endw

帖子:103

-->

为了知识的完整性c语言对应汇编语句,这里补充一下C语言里的分支语句

二、分支语句

1、if-else 语句

为了观察其汇编语句,下面是一个简单的if判断结构:

if(a>0 && a<10)

{

printf("a>0");

}

else if( a>10 && a<100)

{

printf("a>10 && a<100");

}

else

{

printf("a>10 && a<100");

}

if 判断都是使用cmp再加上条件跳转指令。对于if( A && B)的状况c语言对应汇编语句,一般都是使用否决法。如果A不成立,立刻跳下一个分支。依次,如果 B 不成立,同样跳下一分支。

cmp 条件

jle 下一个分支

所以开始部分的反汇编为:

if(a>0 && a<10)

00411A66cmp dword ptr [c],0

00411A6Ajle 411A81h ; 跳下一个else if的判断点

00411A6Ccmp dword ptr [c],0Ah

00411A70jge 411A81h ; 跳下一个else if的判断点

{

printf("a>0");

00411A72push offset string "a>0" (4240DCh)

汇编语言和c语言哪个难_c语言对应汇编语句_c语言嵌入汇编

00411A77call @ILT+1300(_printf) (411519h)

00411A7Cadd esp,4

}

else if 的跟 else 的特征是,开始都有一条无条件跳转至判断结束处,阻止中间的分支执行结束后,直接开启这个分支。这个分支可执行至的惟一方法也是,前面的判定条件不满足。

else 则在jmp之后直接执行操作。而else if则开始重复if之后的操作,用cmp比较,然后用条件跳转指令时行跳转。

else if( a>10 && a<100)

00411A7Fjmp 411AA9h ;直接跳至判断块外

00411A81cmp dword ptr [c],0Ah ;比较+条件跳转,目标为下一个分支处

00411A85jle 411A9Ch

00411A87cmp dword ptr [c],64h

00411A8Bjge 411A9Ch

{

printf("a>10 && a<100");

00411A8Dpush offset string "a>10 && a<100" (424288h)

00411A92call @ILT+1300(_printf) (411519h)

00411A97add esp,4

}

else

00411A9Ajmp 411AA9h ;这里是else,所以唯有简单的一条跳转。

{

printf("a>10 && a<100");

00411A9Cpush offset string "a>10 && a<100" (424288h)

00411AA1call @ILT+1300(_printf) (411519h)

00411AA6add esp,4

}

return c;

2、switch-case 语句

switch 的特征是有多个判定。因为 swtich 显然不用判断大于小于,所以都是je(因此,C语言中switch语句不支持float类别的数组),分别跳至每个case处。最后一个是无条件跳转,直接跳至default处。以下的代码:

switch(a)

{

case 0:

printf("a>0");

case 1:

{

printf("a>10 && a<100");

break;

}

default:

printf("a>10 && a<100");

}

汇编语言和c语言哪个难_c语言嵌入汇编_c语言对应汇编语句

反汇编的switch(a)

00411A66mov eax,dword ptr [a]

00411A69mov dword ptr [ebp-0E8h],eax

00411A6Fcmp dword ptr [ebp-0E8h],0// case 0:

00411A76je 411A83h

00411A78cmp dword ptr [ebp-0E8h],1// case 1:

00411A7Fje 411A90h

00411A81jmp 411A9Fh// default:

{

…

显然是非常a 是否是0、1这两个数字。汇编指令先把a移动至[ebp-0E8h]这个地址,然后再非常,这是调试版本编译的特征。可能是为了避免直接操作堆栈而造成堆栈破坏?最后一条直接跳转到default处。当然,如果没有default,就会跳到swtich{}之外。

从此处我们可以看到:switch语句里,完成“比较判断”的指令会与“case”指令的两个别,在汇编中,不是按照C语句逐句翻译的,而是分开为两个指令模块来推动的!

case 0:

printf("a>0");

00411A83push offset string "a>0"(4240DCh)

00411A88call @ILT+1300(_printf) (411519h)

00411A8Dadd esp,4

case 1:

{

printf("a>10 && a<100");

00411A90push offset string "a>10 && a<100" (424288h)

00411A95call @ILT+1300(_printf) (411519h)

00411A9Aadd esp,4

break;

00411A9Djmp myfunction+8Ch (411AACh)

}

default:

printf("a>10 && a<100");

00411A9Fpush offset string "a>10 && c<100" (424288h)

00411AA4call @ILT+1300(_printf) (411519h)

00411AA9add esp,4

}

至于case 和 default分支中,如果有break,则会降低一个无条件跳转汇编指令。若没有break,则就没有任何循环控制代码。

小结:如果在反汇编代码中看到连续多个“比较cmp”和“相等跳转je”就会使人联想到“switch”语句了!

帖子:64

-->

学习了 比较容易看懂 (*^__^*) 嘻嘻……

c语言嵌入汇编_汇编语言和c语言哪个难_c语言对应汇编语句

帖子:3622

-->

支持一下,不过终于有不少人做过这种的工作了,当然我不是不鼓励这种的文章,而是期望可以不同的角度以及不同的方法表达,方便不同性格的人学习才是重要的

帖子:1020

-->

我来说说笨笨.....

支持一下笨笨的逆向分析教程

帖子:36

-->

貌似在某本书上发现过

帖子:650

-->

这篇文章我喜欢 简约而又不简洁 希望楼主今后多发几篇这样的预测

帖子:650

-->

有了这个原理 就可以IDA 的 F5了 O(∩_∩)O~

帖子:32

-->

很踏实的学习

帖子:57

-->

sunnytown2009-5-31 14:52

学习了,受教

帖子:234

-->

林郎君2009-5-31 15:25


本文来自电脑杂谈,转载请注明本文网址:
https://www.pc-fly.com/a/jisuanjixue/article-138786-1.html

    相关阅读
      发表评论  请自觉遵守互联网相关的政策法规,严禁发布、暴力、反动的言论

      热点图片
      拼命载入中...