如何在C内联汇编(GCC)中更改内存地址下的值

时间:2016-11-04 20:53:02

标签: c gcc assembly inline-assembly

在我的汇编程序课程中的一个练习中,我们必须创建一个程序,将char *中的所有大写字母更改为小写。

 char *a = "AAA BB CCC";
 char *b;
 asm(
 ".intel_syntax noprefix;"
   "xor ecx, ecx;"
   "xor eax, eax;"
   "lea eax, [%[a]];"  // getting address of the first char into eax
  "loop:"
   "inc ecx;" // loop variable
   "cmp ecx, 10;" // 10 cycles for very character in *a
   "jne lowercase;"
   "jmp end;"
 "lowercase:"
   "mov bl, [eax];" // copy value stored under eax address to bl
   "add bl, 32;" // make it lowercase in ASCII
   "mov [eax], bl;" // copy it back to address stored in eax
   "inc eax;" // move pointer to the next char
   "jmp loop;"
 "end:"
   "lea %[b], [eax];" 
 ".att_syntax prefix;"
   : [b] "=r" (b)
   : [a] "r" (a)
  : "eax", "ebx", "ecx"
 );

我的想法是获取第一个char的地址,将其增加32(将其设为ASCII小写),将其保存在同一地址上,而不是将指针移动到下一个char,依此类推。获取第一个字符并向其添加32工作正常,它的这一行引发“分段错误”:

"mov [eax], bl;"

根据我的理解,它应该将eax中保存的地址下的值更改为bl的值。我觉得我错过了一些明显的东西,但我对此很新,到目前为止我在网上找到的所有内容都让我相信这就是我应该这样做的。

0 个答案:

没有答案