在 Windows PC 上学习 x86 汇编语言有什么技巧?

What is the trick to learn x86 assembly language on Windows PC?

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

我找到的每一本汇编语言书籍,都从一些关于数字系统的讨论开始,然后是寄存器、调试等等。阅读一两章后,我的大脑就会被大量信息和问题弄得一团糟。我来回浏览这本书以找到我问题的答案。然后我从书上读到的所有信息似乎都没有用。这种情况一遍又一遍地发生。

我一定是漏了什么。

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

我需要遵循哪些步骤?

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

2) 从模拟器开始,裸机使它变得容易得多...例如 pcemu。理想情况下,可以向您显示 运行s、寄存器和内存访问等内容,而不是 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  
...

从那个 fun.s

.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 程序,编译和反汇编,在网上或你的书中查找这些说明。尽可能制作模组,看看会发生什么。

编译器不一定生成易于理解的代码,但显然是有效的代码。并且生成的代码不是唯一的方法,还可以使用不同的优化级别,对于这种事情,只要您可以编写没有死代码的高级代码,就可以进行优化。