如何获取第一个命令行参数并将其放入内存中的静态缓冲区?

How to get the first command-line argument and put it into static buffer in memory?

我想将长度为 4 的第一个命令行参数放入缓冲区。我可以通过以下方式获取它的每个字符:

.code64
.global _start

.bss

  .lcomm  mybuf , 4

.text
_start:

    mov   16(%rsp) ,  %rsi        #   argv[1]  
    movzx   (%rsi) ,  %ebx        #   first  char of argv[1]
    movzx  1(%rsi) ,  %ebx        #   second  char of argv[1]
    movzx  2(%rsi) ,  %ebx        #   third   char of argv[1]
    movzx  3(%rsi) ,  %ebx        #   fourth  char of argv[1]

  xor %rax , %rax
  inc %rax
  int [=10=]x80

但是如何将长度为4的整个字符串放入我的缓冲区中呢?我的系统是 x64-Linux with GAS.

您不必将字符串本身的内容复制到数据缓冲区中。将 16(%rsp) 的值保存在 QWORD 大小的变量中,并根据需要将其与系统调用一起使用。用 C 术语来说,这就是

之间的区别
char lcomm[4];
strcpy(lcomm, argv[1]);
open(lcomm, ...);

char *plcomm;
plcomm = argv[1];
open(plcomm, ...);

第二个也一样。

此外,您的缓冲区大小固定为 4 个字节。如果命令行参数比那个长,您的代码将溢出缓冲区,并可能崩溃。


就是说,如果您认真学习汇编,您最终应该弄清楚如何编写类似 strcpy 的循环。 :)


使用一些汇编代码进行编辑。上次我检查时,文件名作为 RDI 而不是 RSI 进入系统调用:

mov   16(%rsp), %rdi # File name
mov   [=12=], %rsi        # Flags: O_RDONLY, but substitute your own
mov   [=12=], %rdx        # Mode: doesn't matter if the file exists
mov   , %rax        # Syscall number for open
syscall
# %rax is the file handle now

为了将来参考,x86_64 系统调用约定是:

  • 参数依次进入 %rdi、%rsi、%rdx、%rcx、%r8 和 %r9
  • 系统调用 # 进入 %rax
  • 然后执行syscall指令
  • return 值在 %rax
  • %rcx 和 %r11 被破坏,其余寄存器被保留

系统调用的引用是here

u=13=u解决了!你=11=你 你=10=你 u=13=shtnh 然后 Seva Alekseevu=11=u