汇编该怎么学?

2016-11-06 15:50:38 +08:00
 h2so4

现在是看的学堂在线清华的课程,可是看的有点迷糊。

学汇编是因为在学操作系统的时候(也是学堂在线的操作系统课), lab1 就是做一个 Bootloador ,里面有涉及汇编代码,不会汇编的话看不懂。

那该如何去学呢?学到基本能看懂的程度

3218 次点击
所在节点    问与答
23 条回复
h2so4
2016-11-06 16:26:51 +08:00
比如 pushl %ebp 这样的语句,为什么要用 ebp ,而不是别的,视频里没有说,一直很疑惑
U2FsdGVkX1
2016-11-06 16:35:26 +08:00
CPU 的寄存器都是有各自的用途,例如 EAX 、 EBX 、 ECX 、 EDX 是属于通用的,而 ESP 和 EIP 则是栈的指针与当前指令的指针
U2FsdGVkX1
2016-11-06 16:36:53 +08:00
另外学汇编建议可以上王爽的汇编语言啊
wbing
2016-11-06 16:40:42 +08:00
同建议王爽的汇编语言
Sequencer
2016-11-06 16:43:24 +08:00
王爽
h2so4
2016-11-06 16:55:59 +08:00
@U2FsdGVkX1
@wbing
@Sequencer
嗯,我回头看下
刚才看到一篇不错的博文
http://www.cnblogs.com/YukiJohnson/archive/2012/10/27/2741836.html
先把这里面的要点都看懂了,看能不能看懂操作系统里的汇编代码。
helloSwift
2016-11-06 16:57:10 +08:00
王爽,谁看谁知道→_→
后面的路就不知道了,毕竟我连王爽都没看完就放弃了
Senevan
2016-11-06 17:41:28 +08:00
csapp 第三章 学堂在线汇编语言程序设计 poi [我也在跟学堂在线的 ucore 课,可以一起吖]
tyfulcrum
2016-11-06 17:55:04 +08:00
CSAPP 第三章讲的很好,会 C 语言的基础就可以看懂了,看了基本够写 Bootloader 的。王爽的用来入门很不错不过因为是 Intel 语法而且讲了些 DOS 调用啥的所以我主要拿那个应付微机原理考试……
726332269
2016-11-06 18:01:15 +08:00
《 x86 汇编语言:从实模式到保护模式》
snnn
2016-11-06 18:01:42 +08:00
慢慢来。
多花点时间就好了
726332269
2016-11-06 18:08:13 +08:00
@h2so4 pushl %ebp 是一种常用的函数调用过程,通常会先 pushl %ebp 保存 ebp 原来的值,然后 movl %esp,%ebp ,这样就可以通过 ebp 来访问调用参数了。至于为什么要用 ebp ,是因为 ebp 会默认使用 ss 段来组成物理地址,方便,这也是设计 ebp 寄存器的目的。
cctvsmg
2016-11-06 18:11:04 +08:00
王爽个屁,这个话题就能看出, web 码农为主的社区,和内核调试相关论坛的区别
都什么年代了还从 8 位 16 位的汇编开始学,不可否认学习 32 位之前的汇编有助于锻炼大脑,但是 intel 早期那种分两次寻址的方式,其实无非就是被硬件限制,而不得已采用的、破坏技术美感的蹩脚方式,非常不利于人类理解。从 32 位以后,寻址方式一般就是线性地址即可(除非你要做 win7 上的 128g 内存,才会用到 pae 等方式),这就大大降低了初学者的理解难度。
要学习汇编,最好是从 win32 汇编入门,去这个网站, http://www.aogosoft.com/, 这个网站在全世界汇编领域也是极其重要的一站式入门方式,然后下载站长定制的 MasmPlus ,非常好用,有各种自动提示,不会像拿一个 fasm ide 那样煞笔。

然后最重要的,要想理解汇编,不是要多看书,而是要一步一步跟踪程序在汇编状态下的运行,所以下个 ollydbg ,把你的 c 语言的 helloworld 的—— release 版本(这很重要, debug 版本里面各种 symbol 会乱套),用 ollydbg 加载运行下看看,就容易理解。

当然用 ida 也可以, ida 一般也带 f5 插件,可以一键把汇编转成 c 语言伪代码。
introom
2016-11-06 18:23:48 +08:00
@cctvsmg 你说了我想说的。 那些动辄王爽的是什么鬼。
snnn
2016-11-06 18:36:24 +08:00
别吵吵。要写 bootloader 就得学 16 位汇编
h2so4
2016-11-06 18:38:20 +08:00
@Senevan 好啊

@726332269
@cctvsmg
@tyfulcrum 感谢~
Senevan
2016-11-06 18:51:31 +08:00
@h2so4 = =v2 好像没有私信,你加我 q.q 吧 base64: MTkwNTY3MjY4
mikicomo
2016-11-06 19:07:27 +08:00
@Senevan 哈哈,我也正在看,加一个,一起一起~
joke392
2016-11-06 21:11:20 +08:00
分享我个人的一些经验,我没有很系统地学习过汇编,汇编的知识基本上都是在查 bug 的时候分析反汇编的过程中学到的,指令看不懂再去 google 。

汇编的关键不是语法而是原理,如果你能弄明白“函数是什么”这个问题,自然就知道该如何去学习汇编了。下面的几个问题也许能给你提供一些方向:
1. CPU 、寄存器和内存的关系是什么?反汇编一下`a=1; b=2; a++; c=a+b;`这段简单的代码也许能加深你的理解, a 是静态变量和局部变量时有什么不同?
2. 函数执行完后为什么能回到原来的位置继续执行?不妨再反汇编一段简单的代码看看。
3. 尝试看懂程序编译后生成的 map 文件
4. 从中断返回后,为什么还能回到原来执行的位置继续执行?
Sasasu
2016-11-06 21:40:55 +08:00
http://imgur.com/tdR8nH5
花了两周看完了,感觉不错。
这本书看起来十分舒服,语言流畅,作业也指导的十分详细。
看完后关掉 32 位 windows xp 虚拟机,打开 gcc 生成一段汇编。
卧槽 exp 是啥 就是 cs : ip 啊
卧槽 eax 是啥 ax 么?
卧槽 这是两种语言啊,每个寄存器的用途我要重新记啊。

这就是我几个小时前的感受 : )

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/318489

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX