【问题标题】:Is that a way to declare a variable or it just a label (Nasm)?这是一种声明变量的方法还是只是一个标签(Nasm)?
【发布时间】:2021-10-15 14:40:39
【问题描述】:

据我所知,当我想保留内存(变量)时,我会执行以下操作:

msg db 'Hello world!',0
num db 10

但是这个呢:

str: db "Welcome to my OS", 0

我的代码(非常简单的引导加载程序):

org 0x7c00
mov bp, 0x7c00
mov sp, bp 

mov ax, str
call printString

jmp $

printString:
    mov al, [str]
    mov ah, 0eh
    int 10h
  
str db 'W', 0 ; <-- str must to be str:

times 510-($-$$) db 0
dw 0xaa55

:也是用来声明变量还是只是一个标签?

因为我用这种方式str:在bios模式下预留内存。

【问题讨论】:

  • msgnumstr 都是标签。我相信 NASM 允许您在某些情况下省略 :
  • NASM 没有“变量”的概念,它只是发出字节(在 progbits 部分中)或保留空间(在 nobits 部分中)并允许在两者之间的任何位置放置标签。
  • str 的困惑在于它也是一条 x86 指令。尝试使用另一个未知指令的标签。
  • @MichaelPetch:你是对的,问题正如你所说。谢谢。

标签: variables assembly memory nasm


【解决方案1】:

这是 NASM 中不存在的 MASM/TASM 功能的雏形。基本原理是在使用某些指令时,可以在标签名称后省略冒号。

在 MASM/TASM 中曾经有放置冒号和不放置冒号的区别,但在 NASM 中不存在这种区别。

【讨论】:

  • 在我的情况下,当省略冒号 : 时,此错误会出现“错误:操作数后应有逗号、冒号、装饰符或行尾”。所以,msg db 'Hello world!',0 这种方式对我不起作用,而 msg: db 'Hello world!',0 正在起作用。
  • @Lion King:这不应该发生。请显示您的完整源文本(最好在问题中)。
  • @LionKing 符号定义后面的冒号帮助 NASM 区分标识符是 label field 还是 (pseudo)instruction 这样的语句db: db 'W',因此它在 NASM 中是强制性的,但在其他汇编器中可能是可选的。我在€ASM 中选择的方式向后兼容 MASM/TASM/NASM - 定义和引用符号时可以使用冒号,但不是必需的(除非它可能与寄存器或指令名称混淆)。跨度>
  • @vitsoft:正如 [Michael Petch] 在评论中所说,这是一个 x86 指令名称。无论如何,我谢谢你。
  • @LionKing:这就是为什么最好复制/粘贴您实际测试过的东西的原因,尤其是当您不明白为什么某些东西起作用/不起作用时。实际上是str db ... 不起作用,而不是msg db。 Fuz 是正确的,msg db ... 应该始终有效。但是str 是一个 x86 指令助记符 (felixcloutier.com/x86)。最好包含确切的错误消息。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-03-12
  • 2019-06-03
  • 2016-03-16
相关资源
最近更新 更多