汇编中流行的 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 - 对吗?
最佳答案
是的,确实如此!它定义了任意数量的字节,完全包含您提供的内容。
汇编程序中通常使用三个部分。 .text
、.data
和 .bss
。 .text
部分用于代码,可以从中读取或执行,但不能写入。 .data
用于您的初始化(如 C 中的 int a = 56
)变量。它是读写的,但没有执行。 .bss
用于未初始化(如 C 中的 int a
)变量,可以在运行时更改,并且是零初始化的(而不是用特定值初始化)。它具有与 .data
相同的权限。
.data
部分适用于 Hello World,但更喜欢使用 .rodata
(windows 是 .rdata
,谢谢评论),因为它是只读的。
关于variables - 变量定义如何在汇编中工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36601511/