从汇编中的文件中读取

时间:2010-07-27 20:38:00

标签: linux file assembly

我正在尝试在Linux环境中学习汇编 - x86。我能找到的最有用的教程是Writing A Useful Program With NASM。我自己设置的任务很简单:读取文件并将其写入stdout。

这就是我所拥有的:

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变量或者根本没有变量。

我该怎么做?

(旁白:经过至少一个小时的搜索后,我对学习装配的资源质量低下感到震惊。当唯一的文件是在网上交易的传闻时,电脑怎么运行? )

3 个答案:

答案 0 :(得分:9)

哦,这会很有趣。

汇编语言没有变量。这些是更高级别的语言结构。在汇编语言中,如果你想要变量,你可以自己制作变量。上坡。双向。在雪地里。

如果你想要一个缓冲区,你将不得不使用堆栈的某个区域作为缓冲区(在调用适当的堆栈帧设置指令之后),或者使用堆上的某个区域。如果你的堆太小,你将不得不做一个SYSCALL指令(另一个INT 80h)来请求操作系统更多(通过sbrk)。

另一个选择是了解ELF格式并在适当的部分创建一个全局变量(我认为它是.data)。

任何这些方法的最终结果都是您可以使用的内存位置。但是你唯一真实的“变量”,就像你已经习惯了现在看似奇妙的C世界一样,是你的寄存器。其中并不是很多。

汇编程序可能会帮助您使用有用的宏。阅读汇编文档;我不记得他们在我的头顶。

ASM层面的生活很艰难。

答案 1 :(得分:2)

你必须在bss部分声明你的缓冲区和数据中的bufsize

section .data
   bufsize dw      1024

section .bss
   buf     resb    1024

答案 2 :(得分:0)

调用open后,文件句柄在eax中。你理所当然地将eax移动到ebx,在那里调用read会查找它。不幸的是,此时你已经用3覆盖了它,系统调用用于阅读。

相关问题