5

我一直在尝试掌握如何在汇编中进行一些简单的编程。我正在查看一个教程 hello world 程序,他们解释的大部分内容都是有道理的,但他们真的在掩饰它。我需要一些帮助来理解程序的某些不同部分。这是他们的教程示例-

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

有文本部分和数据部分。数据部分似乎保存了我们为程序定义的信息。看起来程序的“框架”在文本部分,“肉”在数据部分......?我假设程序在编译时执行文本部分,并将数据部分中的数据填充到文本部分?bss/text/data 部分的交互对我来说有点陌生。同样在数据部分中 msg 和 len.... 变量?提到了,它们后面跟着一些我不知道该怎么做的信息。msg后面跟着db,这是什么意思?然后是文本,然后是 0xa,0xa 是干什么用的?len 后面也跟着 equ,这是否意味着等于?len 等于dollarsign 减去msg 变量?美元符号是什么?某种运算符?还有文本部分中的说明,mov ebx,1 显然,或者似乎告诉程序使用STDOUT?将 1 移到 ebx 寄存器是设置标准输出的标准指令吗?

也许有人有更详尽的教程可以推荐?我想弄脏组装,如果你愿意的话,我需要自学一些……“核心基础”。感谢所有的帮助!

4

1 回答 1

15

[注意-我不知道您使用的是哪种汇编语言,所以我只是对这些东西的某些部分进行了一些“最佳猜测”。如果有人可以帮助澄清,那就太好了。]

看起来程序的“框架”在文本部分,“肉”在数据部分......?

文本部分包含构成程序的可执行指令。数据部分包含所述程序将要操作的数据。之所以有两个不同的部分,是为了让程序加载器和操作系统能够为您提供一些保护。例如,文本部分可以加载到只读内存中,数据部分可以加载到标记为“不可执行”的内存中,因此代码不会意外(或恶意)从该区域执行。

我假设程序在编译时执行文本部分,并将数据部分中的数据填充到文本部分?

该程序(文本部分中的说明)通常会引用符号并操作数据部分中的数据,如果这是您所要求的。

bss/text/data 部分的交互对我来说有点陌生。

BSS 部分类似于数据部分,不同之处在于它都是零初始化的。这意味着它实际上不需要占用可执行文件中的空间。程序加载器只需在内存中创建一个大小合适的零字节块。您的程序没有 BSS 部分。

同样在数据部分中 msg 和 len.... 变量?提到了,它们后面跟着一些我不知道该怎么做的信息。msg后面跟着db,这是什么意思?

msg并且len是某种变量,是的。 msg是一个全局变量,指向后面的字符串 -db表示data byte,表示汇编器应该只发出后面的文字字节。 len被设置为字符串的长度(更多见下文)。

然后是文本,然后是 0xa,0xa 是干什么用的?

0x0a是 ASCII 换行符的十六进制值。

len 后面也跟着 equ,这是否意味着等于?

是的。

len 等于dollarsign 减去msg 变量?美元符号是什么?某种运算符?

意思是“$当前位置”。当汇编器开始工作时,它会跟踪在计数器中生成了多少字节的数据和代码。所以这段代码是说:“从当前位置减去msg标签的位置并将该数字存储为len”。由于“当前位置”刚刚超过字符串的末尾,因此您可以在此处获得长度。

还有文本部分中的说明,显然是 mov ebx,1,或者似乎告诉程序使用 STDOUT?将 1 移到 ebx 寄存器是设置标准输出的标准指令吗?

程序正在通过int 0x80指令进行系统调用。在此之前,它必须以操作系统期望的方式进行设置——在这种情况下,看起来就像把 a和其他三个寄存器一起放入意味着——消息长度 in 1ebx1指向消息 in 的指针,以及系统中的电话号码。我猜你在 linux 上——你可以从 google 查找一个系统调用表而不会太麻烦,我敢肯定。stdoutedxecxeax

也许有人有更详尽的教程可以推荐?

对不起,不是我的头顶。

于 2013-06-12T20:45:46.630 回答