我正在尝试学习汇编——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/