V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
12tall
V2EX  ›  程序员

分享一个遇到的神奇问题吧

  •  
  •   12tall ·
    12tall · 2019-09-26 12:54:36 +08:00 · 2110 次点击
    这是一个创建于 1645 天前的主题,其中的信息可能已经有所发展或是发生改变。

    先分享一个这两天遇到的nasm 汇编中的'\'

    以前只知道 C 语言宏中'' 表示后跟一行,但是今天发现在 nasm(甚至是注释中) 也同样适用

    ; 这是我源代码
        mov ax, BaseOfLoader   ; (注意这里👉); \
        mov es, ax                          ; set params
        mov bx, OffsetOfLoader              ; set
        mov ax, [wSectorNo]                 ; 
        mov cl, 1                           ; read Sector 1
        call ReadSector                     ; /
        
    ; 这是书上的代码
        mov	ax, BaseOfLoader
        mov	es, ax			; es <- BaseOfLoader
        mov	bx, OffsetOfLoader	; bx <- OffsetOfLoader
        mov	ax, [wSectorNo]		; ax <- Root Directory 中的某 Sector 号
        mov	cl, 1
        call ReadSector
    

    看起来没什么不同,对吧~,但是编译完之后的机器指令居然漏了一条:mov es, ax

    ; 我写的源码编译后的机器码对照  
    00007C60  B80090            mov ax,0x9000
                                              ; 👈少了 mov es, ax
    00007C63  BB0001            mov bx,0x100
    00007C66  A1A67C            mov ax,[0x7ca6]
    00007C69  B101              mov cl,0x1
    00007C6B  E87E00            call 0x7cec
    
    
    ; 书上的源码产生的机器码对照
    00007C60  B80090            mov ax,0x9000
    00007C63  8EC0              mov es,ax	; 👈
    00007C65  BB0001            mov bx,0x100
    00007C68  A1B17C            mov ax,[0x7cb1]
    00007C6B  B101              mov cl,0x1
    00007C6D  E88700            call 0x7cf7
    

    源码"没有区别",但是结果就是不一样,一度怀疑人生~,但是就突然想到会不会是'\' 的原因,因为这两天一直在学习 C 语言中,宏命令也琢磨了很久,大概是条件反射吧,试了一下果然解决了问题。然后才在官方文档看到了解释:NASM uses backslash (\) as the line continuation character; if a line ends with backslash, the next line is considered to be a part of the backslash-ended line.

    感觉真的好幸运,偶然得到了答案。一知半解就上手,出了问题都不知道怎么描述,真的是太恐怖了

    所以大佬们是否有兴趣分享一下遇到的神奇问题,也好让我等菜鸟遇坑时可以有个参考的方向

    12 条回复    2019-09-27 10:56:32 +08:00
    zhao305149619
        1
    zhao305149619  
       2019-09-26 13:03:00 +08:00
    12tall
        2
    12tall  
    OP
       2019-09-26 13:07:09 +08:00
    @zhao305149619
    《 Orange'S:一个操作系统的实现》

    赶紧抱走链接,(●ˇ∀ˇ●)
    zhao305149619
        3
    zhao305149619  
       2019-09-26 13:10:40 +08:00
    zhao305149619
        4
    zhao305149619  
       2019-09-26 13:11:54 +08:00
    @12tall 个人觉得思路要比那个好一点,不过交叉看看是最好的
    12tall
        5
    12tall  
    OP
       2019-09-26 13:15:34 +08:00
    @zhao305149619 感觉是这样的,多了解一些信息,思路就会开阔很多,甚至在看起来毫无干系的方面也可能会激发灵感🤙
    zealot0630
        6
    zealot0630  
       2019-09-26 13:24:52 +08:00
    转义是在词法阶段,处理注释是在文法阶段。词法当然在文法前面了。

    了解里面的工作原理就能彻底远离这种问题了
    nvioue
        7
    nvioue  
       2019-09-26 13:45:46 +08:00 via Android
    牛逼了 全民前端的时代这里还有汇编大佬 666
    12tall
        8
    12tall  
    OP
       2019-09-26 13:45:56 +08:00
    @zealot0630
    先记下了,现在还搞不太懂,感谢
    12tall
        9
    12tall  
    OP
       2019-09-26 13:46:58 +08:00
    @nvioue
    全民互联网 也还得有人搬砖不是 (●ˇ∀ˇ●)
    nvioue
        10
    nvioue  
       2019-09-26 20:24:54 +08:00 via Android
    @12tall 大佬哪个公司的 还要人么
    12tall
        11
    12tall  
    OP
       2019-09-27 08:24:16 +08:00
    @nvioue
    额 我只是一个机械行业里的伪员,还是不来的好😭
    12tall
        12
    12tall  
    OP
       2019-09-27 10:56:32 +08:00
    @zealot0630
    好像懂了一些,感谢大佬!👍
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   3207 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 26ms · UTC 11:34 · PVG 19:34 · LAX 04:34 · JFK 07:34
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.