argv[0]
我写这个是为了在 x86中打印:
.section .data
newline: .int 0xa, 0
.section .text
.globl _start
_start:
sub %al, %al
movl 4(%esp), %edi /* Pointer to argv[0]. */
sub %ecx, %ecx /* Set %ecx to 0.*/
not %ecx /* Set %ecx to -1.*/
repne scasb /* Search for %al over and over.*/
not %ecx /* Set %ecx to |%ecx| - 1.*/
dec %ecx
movl %ecx, %edx /* Move the strlen of argv[0] into %edx.*/
movl $4, %eax
movl $1, %ebx
movl 4(%esp), %ecx
int $0x80
movl $newline, %ecx
movl $1, %edx
int $0x80
movl $1, %eax
movl $0, %ebx
int $0x80
当我运行这个文件(“打印”)时,输出是这样的:
[08:27 assembly]$ ./print test
./print[08:30 assembly]$
当我通过 gdb 运行它时,edx 中保存的实际字符串长度为 27,它正在检查的字符串是“/home/robert/assembly/print”,而不是“./print”。所以我将%esp
偏移量更改为 8,以检查argv[1]
. 使用与之前相同的命令,输出是这样的:
test
[08:33 assembly]$
为什么检查argv[0]
会导致奇怪的输出,什么argv[1]
时候按预期?