2017-09-17 5 views
4

Je fais un cours sur les principes fondamentaux de l'informatique au lycée et j'essaie de comprendre le code d'assemblage et de créer un monde de Hello en C et de le compiler en code d'assemblage. Je comprends que "mov r0, r3" déplace les données du registre 3 vers le registre 0. Cependant, comment puis-je savoir quelle est la valeur de r3?Comprendre l'assemblage à partir d'une sortie gcc

Ci-dessous le code assembleur que j'utilise pour ma compréhension de:

.arch armv6 
.eabi_attribute 27, 3 
.eabi_attribute 28, 1 
.fpu vfp 
.eabi_attribute 20, 1 
.eabi_attribute 21, 1 
.eabi_attribute 23, 3 
.eabi_attribute 24, 1 
.eabi_attribute 25, 1 
.eabi_attribute 26, 2 
.eabi_attribute 30, 6 
.eabi_attribute 34, 1 
.eabi_attribute 18, 4 
.file "hello.c" 
.section .rodata 
.align 2 
.LC0: 
    .ascii "Hello World\000" 
    .text 
    .align 2 
    .global main 
    .type main, %function 
main: 
    @ args = 0, pretend = 0, frame = 0 
    @ frame_needed = 1, uses_anonymous_args = 0 
    stmfd sp!, {fp, lr} 
    add  fp, sp, #4 
    ldr  r0, .L2 
    bl  printf 
    mov  r0, r3 
    ldmfd sp!, {fp, pc} 
.L3: 
    .align 2 
.L2: 
    .word .LC0 
    .size main, .-main 
    .ident "GCC: (Raspbian 4.9.2-10) 4.9.2" 
    .section .note.GNU-stack,"",%progbits 

Ci-dessous mon code C:

// Hello World program in C 

#include<stdio.h> 

main() 
{ 
    printf("Hello World"); 
} 
+0

Debugger ............... –

+0

'main' est une fonction. Cela semble trop simplifié, mais c'est une fonction avec des arguments. Les n premiers arguments sont passés dans les registres. L'affectation réelle d'argument-registre dépend de votre ABI du compilateur. L'instruction 'mov r0, r3' indique que' main' renvoie probablement l'un des arguments. Quel est le code C de la fonction principale? Il est possible que l'ABI définisse que le registre R3 sera retourné tel qu'il était à l'entrée de la fonction. Ce n'est donc rien qui doit être lié à la fonction 'printf'. – harper

+2

Lorsque vous regardez une instruction C comme 'x = y', comment pouvez-vous déterminer quelle est la valeur de y? Même chose ici. –

Répondre

3

Utilisez le débogueur GNU, "gdb"!
gdb --args ./store01 démarre le débogueur GNU.
Il devrait agir comme une console. Vous quittez en tapant quit.
Mais bien sûr, vous voulez exécuter le programme étape par étape et vérifier les contets du registre. Donc, tapez start, qui saute à main() et ignore les choses d'initialisation.
Ensuite, tapez disassemble ou disas pour afficher l'agrégat que vous utilisez.
Exécutez maintenant l'instruction de programme par instruction en tapant stepi.
Et maintenant la partie intéressante: tapez info registers r3 et regardez la sortie!
Et une autre chose fantastique: vous pouvez changer les valeurs d'exécution: essayez p $r0 = 2.
Ce n'est pas tout.
est ici la documentation officielle: https://www.gnu.org/software/gdb/documentation/
Et un bon petit tutoriel utile: http://thinkingeek.com/2013/01/12/arm-assembler-raspberry-pi-chapter-4

+1

'layout layout' est bon pour regarder les changements de registres. –