【问题标题】:How does a variable definition work in assembly?变量定义在汇编中如何工作?
【发布时间】:2016-04-13 14:27:21
【问题描述】:

汇编中流行的 hello world 程序在 .data 部分中定义了字符串“Hello, world!”。根据本教程 (http://www.tutorialspoint.com/assembly_programming/assembly_variables.htm) db 定义了一个字节(在内存中分配一个字节)。

    section .text
    global _start   ;must be declared for linker (ld)
_start:             ;tells 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

这是否意味着将为每个字符分配一个字节?如果这是正确的,那么这一行将分配 14 个字节(13 个字节用于“Hello, world!”,一个字节用于 0xa - 对吧?

【问题讨论】:

  • 是的。您可以在您的汇编手册中了解这一点。

标签: variables assembly static nasm


【解决方案1】:

是的,确实如此!它定义了任意数量的字节,完全包含你给它的内容。


汇编程序中通常使用三个部分。 .text.data.bss.text 部分用于代码,可以读取或执行,但不能写入。 .data 用于您的已初始化(如 C 中的 int a = 56)变量。它是读写的,但没有执行。 .bss 用于未初始化(如C 中的int a)变量,可以在运行时更改,并且初始化为零(而不是使用特定值初始化)。它与.data具有相同的权限。

.data 部分适用于 Hello World,但更喜欢使用 .rodata(windows 是 .rdata,感谢 cmets),因为它是只读的。

【讨论】:

  • .code 是 Windows 的东西。在 Linux 上,代码位于 .text 部分,就像在使用 Linux 系统调用的问题中一样。 .text 部分和 .rodata 部分链接到只读段中,可执行段中至少包含 .text。
  • .data 用于读取/写入具有非零初始化器的数据,例如 BSS,但带有初始化器。 C 编译器将它用于非const 全局/静态变量。您正在考虑.rodata(非Windows)或.rdata(Windows)。对于初学者来说,将字符串常量与可变数据一起放入.data 是很常见的,但它(通常)不是最优的,也不是编译器所做的。
  • .bss 在现代主流操作系统下不是“未定义的”。它是零初始化的。
  • (这个答案的要点是正确的,一旦你详细解决了所有错误,我想赞成它。同意 asm 在 MASM 之外没有变量本身魔术;由程序员决定使用符号标签 + db 伪指令来实现静态变量。或者寄存器用于局部变量。)
  • 您删除了关于 asm 没有真正具有变量的部分,这是一个您必须自己实现的高级概念。 :(另外,再次校对你关于.data的句子。它不是为了“不需要改变的东西”。另外我建议一个项目符号列表(*-在降价中)谈论每个标准部分。此外,您不需要在答案中留下“编辑:”消息;这就是您保存编辑时更改日志的用途。和/或评论以回复指出要更改的内容的 cmets .
猜你喜欢
  • 2017-01-30
  • 1970-01-01
  • 1970-01-01
  • 2010-11-26
  • 1970-01-01
  • 1970-01-01
  • 2012-09-20
  • 2020-03-20
相关资源
最近更新 更多