经过多年的努力,我无法通过自学来学习x86汇编语言。
我发现的每本汇编语言书都是从数字系统的一些讨论开始,然后是寄存器,调试,然后是等等。阅读了一两章后,我的大脑变得混乱了大量的信息和许多问题。我来回浏览这本书以找到我的问题的答案。然后,我从书中读到的所有信息似乎毫无用处。这种情况一再发生。
我一定错过了什么。
学习汇编语言的基本技巧是什么?
我需要遵循哪些步骤?
答案 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,看看会发生什么。
编译器不一定会生成易于遵循的代码,但代码显然有效。并且生成的代码不是唯一的方法,也可以使用不同的优化级别,对于这种事情,只要您可以编写高级代码并且没有优化的死代码,那么更优化会更好。