如何使用x86 NASM显示日期?

问题描述 投票:0回答:1

尝试显示日期,它告诉我在第 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
linux assembly x86 nasm
1个回答
0
投票

注意一般NASM 源代码行的剖析。 是

label:  instruction  operands  ; comment until end of line

在 NASM 中,

label
后面的冒号是可选的,但我建议始终将其放在那里。 如果您将源代码的第 20th 行更改为

dt: db  __DATE__ ,0xa

(冒号已插入),NASM 组装没有问题。 为什么有区别

  • 任何满足标识符语法要求的行的第一个单词如果后跟冒号,则被视为标签。 这样您就可以定义一个名为

    mov
    的标签,因为它可能是不可取的。

  • 如果满足标识符语法要求的行的第一个单词是not后跟冒号,

    1. NASM 首先检查该单词是否与已知单词的拼写匹配,例如。 g。指令助记符,例如
      syscall
      或汇编指令,例如
      db
    2. 仅当没有匹配时,该单词才被视为标签。

    在你的情况下

    dt
    是一个已知的汇编指令。 它代表“datum ten”,定义一个十字节的字。 特别是用于“扩展精度”浮点值(或压缩 BCD)。

因此 NASM 认为您想要定义一个初始化的十字节字序列 (

dt
),第一个值是(尚未定义,预计将定义)标签
db
,并抱怨后续数据同一行不以逗号分隔。

:对于缩写词的实际含义有多种解释。

© www.soinside.com 2019 - 2024. All rights reserved.