变量定义如何在汇编中工作?

时间:2016-04-13 14:27:21

标签: assembly

程序集中流行的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 - 对吗?

感谢您的帮助。

1 个答案:

答案 0 :(得分:2)

是的,实际上确实如此!它定义了任意数量的字节,完全包含您提供的字节数。


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

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