linux - 从汇编文件中读取

标签 linux file assembly buffer nasm

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

这是我的:

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)。

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

任何这些方法的最终结果都是您可以使用的内存位置。但是你唯一真正的“变量”就像你已经习惯的来自现在看起来很美妙的 C 世界的是你的寄存器。而且数量不多。

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

ASM 级别的生活很艰难。

关于linux - 从汇编文件中读取,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3347747/

相关文章:

linux - Perl 无法设置语言环境,即使它已安装

用于执行 Bash/ksh 环境和 shell 应用程序的 Python GUI?

python - open().read() 安全吗?

C++ 从文件中读取整数,每个数字用逗号分隔

exception - 操作系统开发 : How to avoid an infinite loop after an exception routine

x86 - 在哪里可以找到 x86 的汇编程序?

linux - 为 2 个内核分区 Beaglebone 内部 mmc

c - epoll, kqueue, 用户指定指针 : how to safely deallocate it in a multithreaded envinronment?

python - 如何安全地写入文件?

assembly - 为什么 Linux 上的 NASM 会更改 x86_64 程序集中的寄存器