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");
}
Debugger ............... –
'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
Lorsque vous regardez une instruction C comme 'x = y', comment pouvez-vous déterminer quelle est la valeur de y? Même chose ici. –