用汇编语言显示环境变量

时间:2015-11-18 15:59:15

标签: parsing gcc assembly x86-64

我试图通过制作一个显示环境变量(如

)的基本程序来了解装配是如何工作的

C代码:

,

我用gcc -S(在cygwin64上)编译了一下,看看怎么做,并用自己的方式编写(类似但不一样),但它没有用......

    int         main(int ac, char **av, char **env)
    {
     int        x;
     int        y;

     y = -1;
     while (env[++y])
       {
        x = -1;
        while (env[y][++x])
          {
           write(1, &(env[y][x]), 1);
          }
       }
     return (0);
    }

我的汇编代码:

    $>gcc my_av.s && ./a.exe

    HOMEPATH=\Users\hadrien▒2▒p

有人可以解释一下这段代码有什么问题吗?

此外,在尝试解决问题时,我厌倦了在cmpq操作中将$ 0替换为$ 97,认为它会停止在' a'性格,但它没有......为什么?

1 个答案:

答案 0 :(得分:1)

你有一些问题。在这段代码(loop2)中你有:

    addq    %rdx, %rax
    movq    %rax, %rdx
    movq    (%rax), %rax
    cmpq    $0, %rax

movq (%rax), %rax已阅读%rax 中的后8个字符。你只对第一个角色感兴趣。实现此目的的一种方法是将%rax 中的最低有效字节与0进行比较。您可以使用 cmpb 并使用%al寄存器:

    cmpb    $0, %al

最大的问题是理解char **env是指向char *数组的指针。首先需要获取数组的基指针,然后用{{1}索引该基指针}。索引看起来像basepointer +(y * 8)。您需要将y乘以8,因为每个指针的宽度为8个字节。该位置的指针将是特定环境字符串的y。然后,您可以索引字符串数组中的每个字符,直到找到 NUL (0)终止字符。

我稍微修改了代码并在我更改的几行上添加了注释:

char *