如何获取第一个命令行参数并将其放入内存中的静态缓冲区?
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
我想将长度为 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。