2016-10-17 1 views
0

Guter Abend, ich versuche, diesen Code von mir aus C bis zur Montage IA32 zu übersetzen:Filin Char Array mit Zeichen eines größeren Arrays | @ASSEMBLY IA32

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

n ein Zeichen ist, das einen Wert von Benutzer erhält. Zu dem Zeitpunkt, an dem dieses "for" ausgeführt wird, ist "c" bereits mit Zeichen gefüllt. Ich möchte, wie Sie sehen können, füllen Sie "s" mit den ersten drei Einträge von "c". Ich übersetzte diesen Code zu Montage wie folgt aus:

.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 

Sache ist, wenn ich diesen Code ausführen es nichts überhaupt nicht gedruckt werden, es ist wie „s“ Array es leer ist, habe ich einige Dinge ausprobiert und nichts hat soweit gearbeitet. Irgendein Versammlungsgenie, um mir zu helfen?

:-) Danke!

+0

Warum Sie nicht einen C-Compiler als Referenz verwenden? – Michas

+0

Ich versuchte es mit einem Online-Disassembler, aber Code ist nicht für Menschen (mich) zu verstehen, total komisch. :( –

+0

Verwenden Sie C-Compiler, um C-Code in Assembly zu übersetzen. – Michas

Antwort

1

Nach hat gut funktioniert für mich:

.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 
  • -Code in .text gehört, nicht in .bss
  • addl $8,%ebp in der Nähe von Ende haben sollte addl $8,%esp gewesen Stapelzeiger zu beheben, nachdem printf Anruf
  • benötigt ret am Ende der main
  • sollten Sie wahrscheinlich explizit einen Nullterminator am e speichern nd der Zeichenfolge (es sei denn, Sie erwarten, es aus der Quellzeichenfolge zu kopieren). Ich habe diese Änderung jedoch nicht gemacht.

Ich glaube nicht, dass ich etwas anderes geändert habe.

Montiert und verbunden mit:

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

Eingang:

abc 3 

Ausgang:

abc 
Verwandte Themen