从汇编中的文件读取 我正在尝试学习组装 - x86在Linux环境中。 我能找到的最有用的教程是用NASM编写一个有用的程序。 我自己设置的任务很简单:阅读文件并写入...

问题描述 投票:0回答:1
section .text ; declaring our .text segment global _start ; telling where program execution should start _start: ; this is where code starts getting exec'ed ; get the filename in ebx pop ebx ; argc pop ebx ; argv[0] pop ebx ; the first real arg, a filename ; open the file mov eax, 5 ; open( mov ecx, 0 ; read-only mode int 80h ; ); ; read the file mov eax, 3 ; read( mov ebx, eax ; file_descriptor, mov ecx, buf ; *buf, mov edx, bufsize ; *bufsize int 80h ; ); ; write to STDOUT mov eax, 4 ; write( mov ebx, 1 ; STDOUT, ; mov ecx, buf ; *buf int 80h ; ); ; exit mov eax, 1 ; exit( mov ebx, 0 ; 0 int 80h ; );

这里的一个关键问题是,教程永远不会提及如何创建缓冲区,bufsize变量或实际上变量。

我怎么做?

(旁边:在搜索至少一个小时后,我对学习组装资源的低质量感到震惊。当唯一的文档是在“网络上交易的传闻”时,任何计算机如何运行?)

哦,这会很有趣。

填充语言没有变量。 这些是高级语言结构。 在汇编语言中,如果您想要变量,就可以自己制作它们。 上坡。 两种方式。 在雪中

如果您想要一个缓冲区,则必须将堆栈的某些区域用作缓冲区(调用适当的堆栈框架设定说明),或在堆上使用某些区域。 如果您的堆太小,则必须进行SYSCALL指令(另一个INT 80H)才能乞求操作系统以获取更多(通过SBRK)。 其他替代方法是了解精灵格式并在适当的部分中创建一个全局变量(我认为是.data)。

这些方法的最终结果是您可以使用的内存位置。  但是,您唯一的真正的“变量”,就像您习惯了C的C e寄存器一样。  而且没有很多。

汇编程序可能会为您提供有用的宏。 阅读汇编文档;我不记得他们从我的头顶上方。 在ASM级别上的生活很艰难。

您必须在BSS部分中声明您的缓冲区,并且在Data中的BufSize

section .data bufsize dw 1024 section .bss buf resb 1024

linux file assembly buffer nasm
1个回答
14
投票

打开呼叫后,文件句柄在eax中。您正确地将EAX移至EBX,在这里阅读的呼叫将寻找它。不幸的是,在这一点上,您已经用3(syscall供阅读的Syscall)覆盖了它。

你愚蠢,我不是我能做的轻松 维珍

-80年计划

最新问题
© www.soinside.com 2019 - 2025. All rights reserved.