Assembly 如何在程序集中获取文件名和文件处理

Assembly 如何在程序集中获取文件名和文件处理,assembly,Assembly,我已经绞尽脑汁,也在网上搜索了汇编中的文件处理,但我仍然对此感到困惑。 我正在使用LinuxShell以AT&T语法创建汇编程序。基本上,我不明白如何将文件名推入ebx。下面是让我困惑的代码 section .text global _start _start: pop ebx ; argc (argument count) pop ebx ; argv[0] (argument 0, the program name) pop ebx ; Th

我已经绞尽脑汁,也在网上搜索了汇编中的文件处理,但我仍然对此感到困惑。 我正在使用LinuxShell以AT&T语法创建汇编程序。基本上,我不明白如何将文件名推入ebx。下面是让我困惑的代码

    section .text
    global _start

    _start:
pop ebx     ; argc (argument count)
pop ebx     ; argv[0] (argument 0, the program name)
pop ebx     ; The first real arg, a filename

mov eax,8       ; The syscall number for creat() (we already have the filename  in ebx)
mov ecx,00644Q  ; Read/write permissions in octal (rw_rw_rw_)
int 80h     ; Call the kernel
            ; Now we have a file descriptor in eax
我不明白,在ebx中弹出值如何有助于打开文件?
请解释一下这些台词。我猜这些行是在接受输入,就像我们在C{例如在main(intargc,char*argv[])中所做的那样。但我无法与之关联。

参数被传递给堆栈中的其他函数。函数可以通过偏移量访问堆栈或单独弹出值来检索它们

pop ebx
pop ebx
pop ebx
因为每个pop操作都会覆盖ebx的值,ebx会保留最后一个弹出的值。因此,这三个说明相当于:

mov ebx, [esp+8] ; esp+0 argc, esp+4 argv, esp+8 first param

顺便说一下,您的代码不是AT&t语法,而是Intel。AT&T语法更像:
mov$8,%eax
,这不可能是正确的。我写了一篇关于获取传递参数的教程:我展示的是从网站上获取的。我正在使用AT&T代码。还有一个问题-何时将这些值推送到堆栈上?我的意思是,我理解的是,当我在控制台中执行./program\u name时,名称“program\u name”被按下。但是如果这个程序是由系统执行的呢&“program\u name”不是从CLI传递过来的。这里是就寝时间,10小时后将联机。谢谢“ssg”@Kris CLI不执行您的程序,操作系统执行。CLI只是告诉操作系统这样做。即使没有CLI,操作系统也知道文件名并将其放入
argv[0]
。它在Linux上被称为
execve()
。您可以在以下位置查看其来源:
\u开始:
标签未
调用
ed!堆叠就像枪手解释的那样。如果用
main:
启动程序,
main
call
ed,堆栈处于不同的状态,代码需要不同。既然你是从
\u start:
开始的,那就照枪手说的做吧。