先分享一个这两天遇到的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.
感觉真的好幸运,偶然得到了答案。一知半解就上手,出了问题都不知道怎么描述,真的是太恐怖了
这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。
V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。
V2EX is a community of developers, designers and creative people.