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

2019-09-26 12:54:36 +08:00
 12tall

先分享一个这两天遇到的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.

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

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

2135 次点击
所在节点    程序员
12 条回复
zhao305149619
2019-09-26 13:03:00 +08:00
12tall
2019-09-26 13:07:09 +08:00
@zhao305149619
《 Orange'S:一个操作系统的实现》

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

了解里面的工作原理就能彻底远离这种问题了
nvioue
2019-09-26 13:45:46 +08:00
牛逼了 全民前端的时代这里还有汇编大佬 666
12tall
2019-09-26 13:45:56 +08:00
@zealot0630
先记下了,现在还搞不太懂,感谢
12tall
2019-09-26 13:46:58 +08:00
@nvioue
全民互联网 也还得有人搬砖不是 (●ˇ∀ˇ●)
nvioue
2019-09-26 20:24:54 +08:00
@12tall 大佬哪个公司的 还要人么
12tall
2019-09-27 08:24:16 +08:00
@nvioue
额 我只是一个机械行业里的伪员,还是不来的好😭
12tall
2019-09-27 10:56:32 +08:00
@zealot0630
好像懂了一些,感谢大佬!👍

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

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

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

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

© 2021 V2EX