Я пытаюсь понять, как монтажные работы, делая основную программу для отображения environement переменных какОтображение переменной среды в ассемблере
код C:
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 -S (на cygwin64), чтобы увидеть, как это сделать, и написал ему свой собственный путь (подобный, но не то же самое), но это не сработало ...
$>gcc my_av.s && ./a.exe
HOMEPATH=\Users\hadrien▒2▒p
Мой код сборки:
.file "test.c"
.LC0:
.ascii "\n\0"
.LC1:
.ascii "\033[1;31m.\033[0m\0"
.LC2:
.ascii "\033[1;31m#\033[0m\0"
.LCtest0:
.ascii "\033[1;32mdebug\033[0m\0"
.LCtest1:
.ascii "\033[1;31mdebug\033[0m\0"
.LCtest2:
.ascii "\033[1;34mdebug\033[0m\0"
.def main; .scl 2; .type 32; .endef
main:
/* initialisation du main */
pushq %rbp
movq %rsp, %rbp
subq $48, %rsp
movl %ecx, 16(%rbp) /* int argc */
movq %rdx, 24(%rbp) /* char **argv */
movq %r8, 32(%rbp) /* char **env */
/* saut de ligne */
/* write init */
movl $1, %r8d /* write size */
movl $1, %ecx /* sortie standart */
leaq .LC0(%rip), %rdx
/* write */
call write
/* debut du code */
movl $-1, -8(%rbp) /* y = -1 */
jmp .Loop_1_condition
.Loop_1_body:
movl $-1, -4(%rbp)
jmp .Loop_2_condition
.Loop_2_body:
/* affiche le charactere */
movl $1, %r8d
movl $1, %ecx
call write
.Loop_2_condition:
addl $1, -4(%rbp) /* x = -1 */
movl -8(%rbp), %eax
cltq
addq 32(%rbp), %rax
movq (%rax), %rax
movq %rax, %rdx
movl -4(%rbp), %eax
cltq
addq %rdx, %rax
movq %rax, %rdx
movq (%rax), %rax
cmpq $0, %rax
jne .Loop_2_body
/* saut de ligne */
movl $1, %r8d /* write size */
movl $1, %ecx /* sortie standart */
leaq .LC0(%rip), %rdx
call write
.Loop_1_condition:
addl $1, -8(%rbp) /* ++y */
movl -8(%rbp), %eax
cltq /* passe eax en 64bits */
addq 32(%rbp), %rax
movq (%rax), %rax
cmpq $0, %rax
jne .Loop_1_body
movl $1, %r8d /* write size */
movl $1, %ecx /* sortie standart */
leaq .LC0(%rip), %rdx
call write
/* fin du programme */
movl $0, %eax /* return (0) */
addq $48, %rsp
popq %rbp
ret
.def write; .scl 2; .type 32; .endef
Может кто-нибудь объяснить мне, что не так с этим кодом, пожалуйста?
Кроме того, пытаясь решить проблему, я устал, чтобы заменить $ 0 на $ 97 на операцию cmpq, думая, что она остановится на символе 'a', но это не так ... Почему?
Они, как вы используете 'y' компенсировать' env' в вашем ассемблере не выглядит правильно. Символ 'char *' больше одного байта. – Michael
Кроме того, окружающая среда отличается, когда вы собираете с или gcc. Gcc добавляет «C-интерфейс» к прологу программы. – turboscrew
См. Https://www.dropbox.com/s/pdcvw8q9ypxtapg/filexor.s.txt?dl=0 – turboscrew