我想将长度为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。
您不必将字符串本身的内容复制到数据缓冲区中。将16(%rsp)
的值保存在DWORD大小的变量中,并将其与所有所需的syscalls一起使用。用C表示,这是
char lcomm[4];
strcpy(lcomm, argv[1]);
open(lcomm, ...);
和
char *plcomm;
plcomm = argv[1];
open(plcomm, ...);
第二个也一样。
此外,缓冲区的固定大小为4个字节。如果命令行参数比该参数长,则您的代码将使缓冲区溢出,并可能崩溃。
就是说,如果您认真学习汇编语言,那么您最终应该弄清楚如何编写类似strcpy
的循环。 :)