【发布时间】:2013-06-09 02:33:09
【问题描述】:
我一直在尝试掌握如何在汇编中进行一些简单的编程。我正在查看一个教程 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 寄存器是设置标准输出的标准指令吗?
也许有人可以推荐一些更全面的教程?我想弄脏组装,如果你愿意的话,我需要自学一些……“核心基础”。感谢大家的帮助!
【问题讨论】:
-
出于好奇,是什么促使您想学习汇编?我不是批评你想要,只是想知道为什么。使用过高级语言后,我个人认为没有必要学习汇编。我错过了什么吗?
-
数据部分没有粘贴到文本部分,代码可以简单地以任何它认为合适的方式使用数据。
db表示会有原始字节,表示字符串“Hello, world!”的字节。后跟换行符(0xa,十六进制表示 10,是 ascii 中的换行符)。len equ $ - msg的意思是“声明len等于这里减去msg”,“这里减去msg”当然是中间的字节数,即字符串的长度。mov ebx, 1只是将ebx设置为 1,但值 1 表示用作文件句柄时的 STDOUT。 -
@wagregg,你曾经从事过任何类型的裸机开发吗?
-
不,我一直站在巨人的肩膀上。编写简单的代码行,在幕后移动大山。对于所有低级的东西,我可能不够聪明。
-
@wagregg 我在工作中涉足安全领域,没什么可紧张的。有一次我阅读并查看了一个挑战项目,其中一部分是查看与恶意代码有关的 asm 文件,我相信是 shell 代码吗?已经有一段时间了......我只是无法完全理解它。从那时起,我一直想熟悉组装。拓宽我的个人技能,然后希望在工作中扩大我的视野;)