先分享一个这两天遇到的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.
感觉真的好幸运,偶然得到了答案。一知半解就上手,出了问题都不知道怎么描述,真的是太恐怖了
1
zhao305149619 2019-09-26 13:03:00 +08:00
|
2
12tall OP |
3
zhao305149619 2019-09-26 13:10:40 +08:00
|
4
zhao305149619 2019-09-26 13:11:54 +08:00
@12tall 个人觉得思路要比那个好一点,不过交叉看看是最好的
|
5
12tall OP @zhao305149619 感觉是这样的,多了解一些信息,思路就会开阔很多,甚至在看起来毫无干系的方面也可能会激发灵感🤙
|
6
zealot0630 2019-09-26 13:24:52 +08:00
转义是在词法阶段,处理注释是在文法阶段。词法当然在文法前面了。
了解里面的工作原理就能彻底远离这种问题了 |
7
nvioue 2019-09-26 13:45:46 +08:00 via Android
牛逼了 全民前端的时代这里还有汇编大佬 666
|
8
12tall OP @zealot0630
先记下了,现在还搞不太懂,感谢 |
12
12tall OP @zealot0630
好像懂了一些,感谢大佬!👍 |