V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
h2so4
V2EX  ›  问与答

汇编该怎么学?

  •  2
     
  •   h2so4 · 2016-11-06 15:50:38 +08:00 · 3434 次点击
    这是一个创建于 2942 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

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

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

    23 条回复    2016-11-07 10:33:40 +08:00
    h2so4
        1
    h2so4  
    OP
       2016-11-06 16:26:51 +08:00
    比如 pushl %ebp 这样的语句,为什么要用 ebp ,而不是别的,视频里没有说,一直很疑惑
    U2FsdGVkX1
        2
    U2FsdGVkX1  
       2016-11-06 16:35:26 +08:00
    CPU 的寄存器都是有各自的用途,例如 EAX 、 EBX 、 ECX 、 EDX 是属于通用的,而 ESP 和 EIP 则是栈的指针与当前指令的指针
    U2FsdGVkX1
        3
    U2FsdGVkX1  
       2016-11-06 16:36:53 +08:00   ❤️ 1
    另外学汇编建议可以上王爽的汇编语言啊
    wbing
        4
    wbing  
       2016-11-06 16:40:42 +08:00
    同建议王爽的汇编语言
    Sequencer
        5
    Sequencer  
       2016-11-06 16:43:24 +08:00
    王爽
    h2so4
        6
    h2so4  
    OP
       2016-11-06 16:55:59 +08:00
    @U2FsdGVkX1
    @wbing
    @Sequencer
    嗯,我回头看下
    刚才看到一篇不错的博文
    http://www.cnblogs.com/YukiJohnson/archive/2012/10/27/2741836.html
    先把这里面的要点都看懂了,看能不能看懂操作系统里的汇编代码。
    helloSwift
        7
    helloSwift  
       2016-11-06 16:57:10 +08:00
    王爽,谁看谁知道→_→
    后面的路就不知道了,毕竟我连王爽都没看完就放弃了
    Senevan
        8
    Senevan  
       2016-11-06 17:41:28 +08:00 via Android   ❤️ 1
    csapp 第三章 学堂在线汇编语言程序设计 poi [我也在跟学堂在线的 ucore 课,可以一起吖]
    tyfulcrum
        9
    tyfulcrum  
       2016-11-06 17:55:04 +08:00   ❤️ 1
    CSAPP 第三章讲的很好,会 C 语言的基础就可以看懂了,看了基本够写 Bootloader 的。王爽的用来入门很不错不过因为是 Intel 语法而且讲了些 DOS 调用啥的所以我主要拿那个应付微机原理考试……
    726332269
        10
    726332269  
       2016-11-06 18:01:15 +08:00 via Android
    《 x86 汇编语言:从实模式到保护模式》
    snnn
        11
    snnn  
       2016-11-06 18:01:42 +08:00 via Android
    慢慢来。
    多花点时间就好了
    726332269
        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 寄存器的目的。
    cctvsmg
        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 语言伪代码。
    introom
        14
    introom  
       2016-11-06 18:23:48 +08:00 via Android
    @cctvsmg 你说了我想说的。 那些动辄王爽的是什么鬼。
    snnn
        15
    snnn  
       2016-11-06 18:36:24 +08:00 via Android
    别吵吵。要写 bootloader 就得学 16 位汇编
    h2so4
        16
    h2so4  
    OP
       2016-11-06 18:38:20 +08:00
    @Senevan 好啊

    @726332269
    @cctvsmg
    @tyfulcrum 感谢~
    Senevan
        17
    Senevan  
       2016-11-06 18:51:31 +08:00
    @h2so4 = =v2 好像没有私信,你加我 q.q 吧 base64: MTkwNTY3MjY4
    mikicomo
        18
    mikicomo  
       2016-11-06 19:07:27 +08:00   ❤️ 1
    @Senevan 哈哈,我也正在看,加一个,一起一起~
    joke392
        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. 从中断返回后,为什么还能回到原来执行的位置继续执行?
    Sasasu
        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 么?
    卧槽 这是两种语言啊,每个寄存器的用途我要重新记啊。

    这就是我几个小时前的感受 : )
    snnn
        21
    snnn  
       2016-11-06 21:48:50 +08:00 via Android   ❤️ 1
    最难的是组成原理。比如实模式、保护模式,物理地址、线性地址如何转换, tlb 是嘛
    oska874
        22
    oska874  
       2016-11-07 10:07:52 +08:00
    难道就没人考虑些 arm/ppc 的 bootloader ?
    a15757817542
        23
    a15757817542  
       2016-11-07 10:33:40 +08:00   ❤️ 1
    学堂在线的 汇编是 32 位的汇编,老师讲的涉及到了保护模式,比如 GDT 和 LDT 还有保护模式中的中断。而且他们的汇编好像是 AT&T 汇编。

    其实你可以从王爽的《汇编语言》开始,这本书是讲 x86 实模式汇编的,看完之后可以买本李忠的《 x86 汇编语言:从实模式到保护模式》,第二本书的第十一章开始到十七章是保护模式的部分,然后这本书配套的源码的其实是用汇编实现了一个非常简单的内核(很简陋)只涉及到进程和内存管理,我看的时候,源码中有几个 bug 。

    应该够你了解汇编了, x86 汇编相较于 AT&T 汇编而言, x86 的资料比较多
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   5577 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 27ms · UTC 01:28 · PVG 09:28 · LAX 17:28 · JFK 20:28
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.