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

问题描述 投票:0回答:1

我想将长度为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 $0x80

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

linux assembly x86 x86-64 gas
1个回答
0
投票

您不必将字符串本身的内容复制到数据缓冲区中。将16(%rsp)的值保存在DWORD大小的变量中,并将其与所有所需的syscalls一起使用。用C表示,这是

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

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

第二个也一样。

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


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

© www.soinside.com 2019 - 2024. All rights reserved.