2013-12-15 2 views
0

Я пытаюсь выполнить сканирование 100-мерной строки в сборке и распечатать ее, используя scanf и printf.scanf string in assembly

 .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 (вместо этой строки). Я чувствую отчаяние в этом вопросе - ответов на сборку в Интернете нет!

+0

Что вы обнаружили, когда вы перешли через это с помощью отладчика? –

+0

Я новичок в сборке. Я не уверен в отладчике ... – zvika

+1

Затем вы должны потратить некоторое время на изучение отладчика. Отладка, вероятно, составляет 50% от программирования. –

ответ

0

Ваша проблема в том, что у вас нет выделенной памяти для вашей строки, поэтому она помещается где-то случайным. Я предлагаю вам зарезервировать некоторое пространство для вашей строки в разделе данных и нажать указатель на это пространство для scanf в качестве аргумента.

Если вы используете локальную переменную стека, так как вы подразумеваете здесь:

pushl -12(%ebp) 

Тогда вы должны зарезервировать некоторое stackspace для него, что вы не как можно увидеть здесь:

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 

Вы не резервируете место в стеке для своего локального указателя. И, конечно же, вам нужно решить, должен ли он быть указателем, тогда вам все же нужно предоставить некоторое пространство для фактической строки или поместить всю строку в стек и зарезервировать там достаточно места.