2011-07-30 3 views
2

J'essaye d'apprendre l'assemblée pour diverses raisons et j'essaye d'écrire un code qui dit bonjour bla bla bla puis lit votre nom, imprime votre nom et dit plus bla bla bla mais il ne montre pas le texte après qu'il obtient votre nom Im sûr que ce quelque chose de stupide ... désolé ...Aide avec le code d'assemblage

voici ce que j'ai jusqu'à présent:

.section .bss 
    .lcomm bufname, 256 
.section .data 
    msg1: 
    .ascii "Hello, please enter your name!\n" # Message to write 
    len1 = . - msg1     # Length of string 

    msg2: 
    .ascii "Good to meet you " 
    len2 = . - msg2 

    msg3: 
    .ascii ". Iam your first assembly program!\n" 
    len3 = . - msg3 

.section .text 

.globl _start 

_start: 
    call get_name 
get_name: 
    #should print msg1 
    mov $4, %eax  # system call number (sys_write) 
    mov $1, %ebx  # file descriptor (stdout) 
    mov $msg1, %ecx  # Message to write 
    mov $len1, %edx  # Lenght of message 
    int $0x80  # Call kernel 

    #should get user input 
    mov $3, %eax  # System call number (sys_read) 
    mov $0, %ebx  # File descriptor (stdin) 
    mov $bufname, %ecx # Buffer to store the name 
    mov $256, %edx  # Lenght of buffer 
    int $0x80 

    #should print msg2  
    mov $4, %eax 
    mov $1, %ebx 
    mov $msg2, %ecx 
    mov $len2, %edx 
    int $0x80 

    #should print bufname (doesn't) 
    mov $bufname, %ecx 
    mov $256, %edx 
    int $0x80 

    #should print msg3 (doesn't) 
    mov $msg3, %ecx 
    mov $len3, %edx 
    int $0x80 

    call exit 
exit: 
    mov $1, %eax 
    mov $0, %ebx 
    int $0x80 

Pour compiler j'utiliser

as Jes.s -o Jes.o 
ld Jes.o -o Jes 

Ceci est la sortie i obtenir

$ ./Jes 
Hello, please enter your name! 
renato 
Good to meet you 

Il doit montrer

Good to meet you renato. Iam your first assembly program! 

Pourquoi est-ce mal? et merci beaucoup pour votre temps!

Répondre

1

Le problème est que lorsque vous appelez l'interruption (int) les registres peuvent être écrasés. Ce n'est pas comme faire un appel de fonction où les registres sont sauvegardés et restaurés pour vous. Vous devez placer des copies de ces lignes avant que tous vos appels int:

mov $4, %eax  # system call number (sys_write) 
mov $1, %ebx  # file descriptor (stdout) 
+0

A travaillé = D merci! – Renato

2

Lorsque vous imprimez le nom, vous présumez que EAX et EBX sont inchangées par rapport à la précédente SYS_write. Ce n'est peut-être pas le cas.

En outre, vous passez la longueur du tampon lors de l'écriture du nom. Etes-vous sûr que vous ne devriez pas dépasser la longueur du nom? Le sys_read devrait avoir renvoyé la longueur de ce qui a été lu. (Vous devrez peut-être l'enregistrer quelque part pendant que vous imprimez msg2.)