尝试显示日期,它告诉我在第 16 行的操作数后面需要一个逗号
section .text
global _start ;must be declared for using gcc
_start: ;tell linker entry point
mov edx, len ;message length
mov ecx, msg ;message to write
mov ebx, 1 ;file descriptor (stdout)
mov eax, 4 ;system call number (sys_write)
int 0x80 ;call kernel
mov eax, 1 ;system call number (sys_exit)
int 0x80 ;call kernel
section .data
msg db 'Hello, world!',0xa ;our dear string
len equ $ - msg ;length of our dear string
dt db __DATE__ ,0xa
len2 equ $ - dt
注意一般NASM 源代码行的剖析。 是
label: instruction operands ; comment until end of line
在 NASM 中,
label
后面的冒号是可选的,但我建议始终将其放在那里。
如果您将源代码的第 20th 行更改为
dt: db __DATE__ ,0xa
(冒号已插入),NASM 组装没有问题。 为什么有区别?
任何满足标识符语法要求的行的第一个单词如果后跟冒号,则被视为标签。 这样您就可以定义一个名为
mov
的标签,因为它可能是不可取的。
如果满足标识符语法要求的行的第一个单词是not后跟冒号,
syscall
或汇编指令,例如 db
。dt
是一个已知的汇编指令。
它代表“datum ten”†,定义一个十字节的字。
特别是用于“扩展精度”浮点值(或压缩 BCD)。
因此 NASM 认为您想要定义一个初始化的十字节字序列 (
dt
),第一个值是(尚未定义,预计将定义)标签 db
,并抱怨后续数据同一行不以逗号分隔。
†:对于缩写词的实际含义有多种解释。