2016-10-17 10 views
0

Добрый вечер, я пытаюсь перевести этот код шахты от C до сборки IA32:Fillin char массив с символами большего массива | @ASSEMBLY IA32

int i=0; 
char s[3]; char c[n]; 
for(i=0;i<3;i++){ 
    s[i]=c[i]; 
} 

п является символом, который принимает значение от пользователя. К тому времени, когда это «для», он выполняет «c», уже заполнен символами. Я хочу, как вы можете видеть, заполнить «s» тремя первыми элементами «c». Я перевел этот код сборки, как это:

.data 
is: .asciz "%s" 
id: .asciz "%d" 
.bss 
.comm c,500,1 
.comm s,500,1 
.comm n,4,4 
.global main 
main: 
    #asking for string to fill "c" 
    pushl $c 
    pushl $is 
    call scanf 
    addl $8,%esp 
    #asking for integer to know how long is c 
    pushl $n 
    pushl $id 
    call scanf 
    addl $8,%esp 
    movl $0,%eax 
    for: 
    cmpl $3,%eax 
    jge endfor 
    movb c(%eax),%cl 
    movb %cl,s(%eax) 
    incl %eax 
    jmp for 

endfor: 
    movl $0,%eax 
    pushl %eax 
    pushl $s 
    pushl $is 
    call printf 
    addl $8,%ebp 
    popl %eax 

Дело в том, когда я исполняю этот код он не печатает вообще ничего, это как «S» массиву он пустой, я попробовал несколько вещей, и ничего не имеет работал до сих пор. Любой герой сборки, чтобы дать мне руку?

:-) Спасибо!

+0

Почему вы не используете компилятор C для справки? – Michas

+0

Я пробовал с помощью онлайн-дизассемблера, но код не для человека (меня), чтобы понять его, совершенно странно. :( –

+0

Использовать компилятор C для перевода кода C на сборку. – Michas

ответ

1

После обработанное отлично для меня:

.data 
is: .asciz "%s" 
id: .asciz "%d" 
.bss 
.comm c,500,1 
.comm s,500,1 
.comm n,4,4 
.text 
.global main 
main: 
    #asking for string to fill "c" 
    pushl $c 
    pushl $is 
    call scanf 
    addl $8,%esp 
    #asking for integer to know how long is c 
    pushl $n 
    pushl $id 
    call scanf 
    addl $8,%esp 
    movl $0,%eax 
    for: 
    cmpl $3,%eax 
    jge endfor 
    movb c(%eax),%cl 
    movb %cl,s(%eax) 
    incl %eax 
    jmp for 

endfor: 
    movl $0,%eax 
    pushl %eax 
    pushl $s 
    pushl $is 
    call printf 
    addl $8,%esp 
    popl %eax 
    ret 
  • код принадлежит .text, а не в .bss
  • addl $8,%ebp вблизи конца должен был addl $8,%esp зафиксировать указатель стека после вызова printf
  • необходимое ret в конце main
  • Вы, вероятно, должны явно хранить nul-терминатор в e nd строки (если вы не собираетесь копировать ее из исходной строки). Однако я не сделал этого изменения.

Я не думаю, что я что-то изменил.

Собранный и связан с:

as -g -32 test.s -o test.o 
gcc -g -m32 test.o 

Вход:

abc 3 

Выход:

abc 
Смежные вопросы