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
打开呼叫后,文件句柄在eax中。您正确地将EAX移至EBX,在这里阅读的呼叫将寻找它。不幸的是,在这一点上,您已经用3(syscall供阅读的Syscall)覆盖了它。
你愚蠢,我不是我能做的轻松 维珍
-80年计划