2015-11-02 46 views
2

我想在asm中反转一个词,使用堆栈(例如Testing = gnitseT)。我试图自己做,但我的程序返回相同的字符串。帮助装配。反向字

我的代码:

#include <stdio.h> 
int main(void) { 
    char *x = "Teststring"; 

    asm (
     ".intel_syntax noprefix;" 
     "mov eax, %1;" 
     "xor bx,bx;" 
     "xor ecx,ecx;" 
     "pushloop:" 
      "mov cl, [eax];" 
      "cmp cl, 0;" 
      "jz poploop;" 
      "inc bx; " 
       "push eax;" 
       "inc eax;" 
       "jmp pushloop;" 
     "xor eax,eax;" 
     "poploop:" 
      "cmp bx, 0;" 
      "jz end;" 
       "pop eax;" 
       "inc eax;" 
       "dec bx;" 
       "jmp poploop;" 
     "end:" 

      "mov %0, eax;" 

     ".att_syntax prefix;" 
    : "=r" (x) 
    : "r" (x) 
    : "eax","cl" 
    ); 
    printf("x=%s", x); 
    return 0; 
} 
+1

对于初学者来说,你不能只是切换到Intel语法编译器的背后,否则所有替代将是错误的。如果您想使用intel语法,请使用'-masm = intel'命令行开关。 – Jester

+0

其中:“Teststring”是一个字符串文字。您无法更改其内容。 – rkhb

回答

2
"pushloop:" 
"mov cl, [eax];" 
"cmp cl, 0;" 
"jz poploop;" 
"inc bx; " 
"push eax;" 
"inc eax;" 
"jmp pushloop;" 

在这个循环中,你要推的性格,所以推ECX寄存器。不是EAX中的地址。

de poploop中的同样问题。但在这里有效地反转任何你需要从头开始重新启动字符串。所以写:

"mov eax, %1;" 
"mov edx, %1;" 

及用途:

;;;;;;;;;;;; "xor eax,eax;" 
"poploop:" 
"cmp bx, 0;" 
"jz end;" 
"pop ecx;" 
"mov [edx], cl;" 
"inc edx;" 
"dec bx;" 
"jmp poploop;" 
"end:"