我试图通过制作一个显示环境变量(如
)的基本程序来了解装配是如何工作的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'性格,但它没有......为什么?
答案 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 *