程序集中的scanf字符串

时间:2013-12-15 13:54:23

标签: assembly scanf

我尝试在装配中扫描100个大小的字符串并使用scanf和printf进行打印。

        .data
strString:  .string "%s"
stringToRev:    .space  100
.text   #the beginning of the code
.globl  main    #the label "main" is used to state the initial point of this program

    .type   main, @function # the label "main" representing the beginning of a function
main:   # the main function:
    pushl   %ebp    #save the old frame pointer
    movl    %esp,   %ebp    #create the new frame pointer
    pushl   %ebx    #saving a callee save register.

leal -12(%ebp), %edx        #choice will be saved in edx
    pushl %edx
    pushl $strString    
    call scanf
    movl  (%edx), $stringToRev

    pushl   -12(%ebp)
    pushl   $strString
    call    printf
    call    Reverse

    pushl   %eax
    pushl   $strString
    call    printf

如果我输入一个字符串,例如" asfdg",则输出0(而不是此字符串)。 我对此感到绝望 - 网上集会没有答案!

1 个答案:

答案 0 :(得分:0)

你的问题是你没有为你的字符串分配内存,所以它是随机放置的。我建议你在数据部分为字符串保留一些空间,并将指向此空间的指针作为参数推送到scanf。

如果您使用的是本地堆栈变量,请在此处暗示:

pushl   -12(%ebp)

然后你还必须为它保留一些堆栈空间,你可以在这里看到它:

 pushl   %ebp    #save the old frame pointer
 movl    %esp,   %ebp    #create the new frame pointer
 pushl   %ebx    #saving a callee save register.

 leal -12(%ebp), %edx        #choice will be saved in edx

您没有在堆栈上为本地指针保留任何空间。当然,您必须确定它是否应该是指针,然后您仍然需要为实际字符串提供一些空间,或者将整个字符串放在堆栈上并在那里保留足够的空间。