1

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]时候按预期?

4

1 回答 1

2

我认为 gdb 通过将完整路径添加到argv[0]. 打印后,%eax保留打印的字符数,因此您需要重新加载 %eax 以sys_write再次打印$newline%ebx应该仍然可以) - 幸运的是,“test”是正确的长度。天知道你用那个更长的字符串得到了什么系统调用!

我会说你做得很好!(在尝试打印之前检查argc以确保其存在可能是个好主意)。argv[1]

于 2013-08-17T11:44:10.343 回答