Я написал приведенный ниже ассемблерный код для преобразования строки из нижнего регистра в верхний. Он не работает полностью, потому что я не могу получить доступ к адресу строки, которую я конвертирую. этот код не работает почему?
#include<stdio.h>
int convert(char *str)
{
char *ptr;
__asm__ __volatile__ ( "movl (%1),%%ebx;"
"subl $1,%%ebx;"
"movl %%ebx,%0;"
"REPEAT: addl $1,%%ebx;"
"testl %%ebx,%%ebx;"
"je END;"
"movzbl 0(%%ebx),%%ecx;"
"cmpl $97, %%ecx;"
"jb END;"
"cmpl $122,%%ecx;"
"ja END;"
"subb $32,0(%%ebx);"
"jmp REPEAT;"
"END: movl %%ebx,(%0);"
:"=r" (ptr)
:"r" (str)
);
printf("converted string =%s\n", str);
}
int main()
{
int i;
char str[] = "convert";
i = convert(str);
return 0;
}
ptr
илиstr
? - person fuz   schedule 05.11.2014*str
в%ebx
в первой инструкции? Почему неstr
? - person fuz   schedule 05.11.2014movl %rdi,%ebx
недопустимая инструкция. Вместо этого вы можете скомпилировать для i386 сcc -m32
. - person fuz   schedule 05.11.2014cc -S
и попытайтесь понять, какую сборку генерирует компилятор. - person fuz   schedule 05.11.2014