在Windows PC上学习x86汇编语言的诀窍是什么?

时间:2015-06-05 01:57:27

标签: assembly x86

经过多年的努力,我无法通过自学来学习x86汇编语言。

我发现的每本汇编语言书都是从数字系统的一些讨论开始,然后是寄存器,调试,然后是等等。阅读了一两章后,我的大脑变得混乱了大量的信息和许多问题。我来回浏览这本书以找到我的问题的答案。然后,我从书中读到的所有信息似乎毫无用处。这种情况一再发生。

我一定错过了什么。

学习汇编语言的基本技巧是什么?

我需要遵循哪些步骤?

1 个答案:

答案 0 :(得分:2)

1)x86可能是最先学习的最差指令集。只是因为你有一个不是一个很好的理由(你可能不知道它,但对于每个x86,你有几个臂处理器而不是使用它们也是一个好主意。)

2)从模拟器开始,裸机使它变得更容易......例如pcemu。理想情况下,它会向您显示运行,注册和内存访问的内容,而不是gdb类型的东西,因为它不会阻止您挂起或崩溃或必然有助于那些。

3)arm / thumb或msp430是很好的指令集

尽管如此,这是在Linux上,但也可以使用Windows完成..

的main.c

#include <stdio.h>

extern unsigned int fun ( unsigned int a, unsigned int b );

int main ( void )
{
    printf("%u\n",fun(1,2));
    return(0);
}

fun.c

unsigned int fun ( unsigned int a, unsigned int b )
{
    return(a+b+7);
}

构建并运行

gcc -O2 -c fun.c -o fun.o
gcc -O2 main.c fun.o -o main
./main
10

现在...

objdump -D fun.o
... the part we care about:
0000000000000000 <fun>:
   0:   8d 44 37 07             lea    0x7(%rdi,%rsi,1),%eax
   4:   c3  
...

从中获取乐趣。

.globl fun
fun:
    lea    0x8(%rdi,%rsi,1),%eax
    retq

将7更改为8

as fun.s -o funs.o
gcc -O2 main.c funs.o -o main
./main
11

你去,一个带有一些x86程序集的程序,后来担心main。在操作系统上运行您可以做的事情非常有限,因此您的双手将被束缚,通常会导致一般保护错误导致程序崩溃。

您可以制作越来越复杂的C程序,编译和反汇编,在网络上或您拥有的书籍中查看这些说明。尽可能制作mod,看看会发生什么。

编译器不一定会生成易于遵循的代码,但代码显然有效。并且生成的代码不是唯一的方法,也可以使用不同的优化级别,对于这种事情,只要您可以编写高级代码并且没有优化的死代码,那么更优化会更好。