汇编该怎么学? - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
h2so4
V2EX    问与答

汇编该怎么学?

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

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

    学汇编是因为在学操作系统的时候(也是学堂在线的操作系统课), 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 调用啥的所以我主要拿那个应付微机原理考试……
    rlexs
        10
    rlexs  
       2016-11-06 18:01:15 +08:00 via Android
    《 x86 汇编语言:从实模式到保护模式》
    snnn
        11
    snnn  
       2016-11-06 18:01:42 +08:00 via Android
    慢慢来。
    多花点时间就好了
    rlexs
        12
    rlexs  
       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/, 这个网站在全世界汇编领域也是极其重要的一站式入门方式,然后下载站长定制的 MasmPls ,非常好用,有各种自动提示,不会像拿一个 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     Solana     5289 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 26ms UTC 07:07 PVG 15:07 LAX 00:07 JFK 03:07
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86