现在是看的学堂在线清华的课程,可是看的有点迷糊。
学汇编是因为在学操作系统的时候(也是学堂在线的操作系统课), lab1 就是做一个 Bootloador ,里面有涉及汇编代码,不会汇编的话看不懂。
那该如何去学呢?学到基本能看懂的程度
1
h2so4 OP 比如 pushl %ebp 这样的语句,为什么要用 ebp ,而不是别的,视频里没有说,一直很疑惑
|
2
U2FsdGVkX1 2016-11-06 16:35:26 +08:00
CPU 的寄存器都是有各自的用途,例如 EAX 、 EBX 、 ECX 、 EDX 是属于通用的,而 ESP 和 EIP 则是栈的指针与当前指令的指针
|
3
U2FsdGVkX1 2016-11-06 16:36:53 +08:00 1
另外学汇编建议可以上王爽的汇编语言啊
|
4
wbing 2016-11-06 16:40:42 +08:00
同建议王爽的汇编语言
|
5
Sequencer 2016-11-06 16:43:24 +08:00
王爽
|
6
h2so4 OP @U2FsdGVkX1
@wbing @Sequencer 嗯,我回头看下 刚才看到一篇不错的博文 http://www.cnblogs.com/YukiJohnson/archive/2012/10/27/2741836.html 先把这里面的要点都看懂了,看能不能看懂操作系统里的汇编代码。 |
7
helloSwift 2016-11-06 16:57:10 +08:00
王爽,谁看谁知道→_→
后面的路就不知道了,毕竟我连王爽都没看完就放弃了 |
8
Senevan 2016-11-06 17:41:28 +08:00 via Android 1
csapp 第三章 学堂在线汇编语言程序设计 poi [我也在跟学堂在线的 ucore 课,可以一起吖]
|
9
tyfulcrum 2016-11-06 17:55:04 +08:00 1
CSAPP 第三章讲的很好,会 C 语言的基础就可以看懂了,看了基本够写 Bootloader 的。王爽的用来入门很不错不过因为是 Intel 语法而且讲了些 DOS 调用啥的所以我主要拿那个应付微机原理考试……
|
10
726332269 2016-11-06 18:01:15 +08:00 via Android
《 x86 汇编语言:从实模式到保护模式》
|
11
snnn 2016-11-06 18:01:42 +08:00 via Android
慢慢来。
多花点时间就好了 |
12
726332269 2016-11-06 18:08:13 +08:00 via Android 1
@h2so4 pushl %ebp 是一种常用的函数调用过程,通常会先 pushl %ebp 保存 ebp 原来的值,然后 movl %esp,%ebp ,这样就可以通过 ebp 来访问调用参数了。至于为什么要用 ebp ,是因为 ebp 会默认使用 ss 段来组成物理地址,方便,这也是设计 ebp 寄存器的目的。
|
13
cctvsmg 2016-11-06 18:11:04 +08:00 8
王爽个屁,这个话题就能看出, 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 语言伪代码。 |
15
snnn 2016-11-06 18:36:24 +08:00 via Android
别吵吵。要写 bootloader 就得学 16 位汇编
|
19
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. 从中断返回后,为什么还能回到原来执行的位置继续执行? |
20
Sasasu 2016-11-06 21:40:55 +08:00 via Android 2
http://imgur.com/tdR8nH5
花了两周看完了,感觉不错。 这本书看起来十分舒服,语言流畅,作业也指导的十分详细。 看完后关掉 32 位 windows xp 虚拟机,打开 gcc 生成一段汇编。 卧槽 exp 是啥 就是 cs : ip 啊 卧槽 eax 是啥 ax 么? 卧槽 这是两种语言啊,每个寄存器的用途我要重新记啊。 这就是我几个小时前的感受 : ) |
21
snnn 2016-11-06 21:48:50 +08:00 via Android 1
最难的是组成原理。比如实模式、保护模式,物理地址、线性地址如何转换, tlb 是嘛
|
22
oska874 2016-11-07 10:07:52 +08:00
难道就没人考虑些 arm/ppc 的 bootloader ?
|
23
a15757817542 2016-11-07 10:33:40 +08:00 1
学堂在线的 汇编是 32 位的汇编,老师讲的涉及到了保护模式,比如 GDT 和 LDT 还有保护模式中的中断。而且他们的汇编好像是 AT&T 汇编。
其实你可以从王爽的《汇编语言》开始,这本书是讲 x86 实模式汇编的,看完之后可以买本李忠的《 x86 汇编语言:从实模式到保护模式》,第二本书的第十一章开始到十七章是保护模式的部分,然后这本书配套的源码的其实是用汇编实现了一个非常简单的内核(很简陋)只涉及到进程和内存管理,我看的时候,源码中有几个 bug 。 应该够你了解汇编了, x86 汇编相较于 AT&T 汇编而言, x86 的资料比较多 |