我已经涉足到了解如何在汇编中进行一些简单的编程.我正在阅读一个教程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等于dollarign减去msg变量?什么是美元符号?一种操作符?文本部分中的说明,mov ebx,1显然,或似乎告诉程序使用STDOUT?移动1到ebx寄存器是设置标准输出的标准指令吗?
也许有人有一个更全面的教程推荐?我希望通过装配变脏,并且需要自学一些……“核心基础”,如果你愿意的话.感谢您的帮助!
解决方法:
[NB – 我不知道你正在使用什么汇编语言,所以我只是对这些东西的某些部分进行了一些“最好的猜测”.如果有人可以帮助澄清,那就太好了.]
It looks like the “frame” of the program is in the text section and the “meat” is in the data section… ?
文本部分包含组成程序的可执行指令.数据部分包含所述程序将要运行的数据.有两个不同部分的原因是允许程序加载器和操作系统能够为您提供一些保护.例如,可以将文本部分加载到只读存储器中,并且可以将数据部分加载到标记为“不可执行”的存储器中,因此不会从该区域意外地(或恶意地)执行代码.
I assume the program when compiled executes the text section with data from the data section filled into the text section?
程序(文本部分中的说明)通常引用符号并操纵数据部分中的数据,如果这就是您所要求的.
The bss/text/data section interaction is kind of foreign to me.
BSS部分类似于数据部分,除了它全部为零初始化.这意味着它不需要实际占用可执行文件中的空间.程序加载器只需在内存中制作一个适当大小的零字节块.您的计划没有BSS部分.
Also in the data section where the msg and len…. variables? are mentioned, they are followed by some information i’m not sure what to make of. msg is followed by db, what does this mean?
msg和len是一种变量,是的. msg是一个指向后面的字符串的全局变量 – db表示数据字节,表示汇编器应该只发出后面的字面字节. len被设置为字符串的长度(更多在下面).
Then the text, and then 0xa, what is the 0xa for?
0x0a是ASCII换行符的十六进制值.
Also len is followed by equ, does this mean equals?
是.
len equals dollarsign minus msg variable? What is the dollar sign? A sort of operator?
$表示“当前位置”.当汇编程序开始工作时,它会跟踪计数器中生成的数据字节数和代码数.所以这段代码说:“从当前位置减去msg标签的位置,并将该数字存储为len”.由于“当前位置”刚刚超过字符串的末尾,因此您可以获得长度.
Also the instructions in the text section, mov ebx,1 apparently, or seems to tell the program to utilize STDOUT? Is moving 1 to the ebx register a standard instruction for setting stdout?
该程序通过int 0x80指令进行系统调用.在此之前,它必须以操作系统期望的方式进行设置 – 在这种情况下,看起来像将ebx1中的1表示为stdout,以及其他三个寄存器 – edx中的消息长度,指向消息的指针ecx和eax中的系统调用号.我猜你是在Linux上 – 你可以从谷歌查找系统调用表而不会有太多麻烦,我敢肯定.
Perhaps someone has a little more thorough tutorial to recommend?
对不起,不是我的头脑.