2017-08-11 1 views
1

Je vous écris ce code simple pour essayer de modifier une chaîne avant de l'imprimer:Assemblée: Comment modifier une chaîne avant de l'imprimer

.data 

    stringaOut:   .ascii "000000\n" 
    stringaOut_len:  .long - stringaOut 

    .text    
     .global main 

    main: 

     leal stringaOut, %esi 
     movl $49, 0(%esi) 
     movl $49, 1(%esi) 
     movl $49, 2(%esi) 
     movl $49, 3(%esi) 
     movl $49, 4(%esi) 
     movl $49, 5(%esi) 
     movl $49, 6(%esi) 

     movl $4, %eax 
     movl $1, %ebx 
     leal stringaOut, %ecx 
     movl stringaOut_len, %edx 
     int $0x80 

     #return 0 
     movl $1, %eax 
     movl $0, %ebx 
     int $0x80   

Je pense qu'il devrait changer les zéros dans la chaîne avec 1, mais pourquoi ça n'imprime rien?

+0

Il imprime ici. – Jester

Répondre

2

movl déplace un l ung entier (32 bits). Ce que vous voulez, c'est movb qui déplace un seul b yte (8 bits). Sinon, chaque affectation remplace inutilement les 3 caractères suivants.

+0

Bien que ce soit vrai, ce n'est pas vraiment pertinent (sauf pour l'écrasement de la fin de ligne finale). Il devrait et continue d'imprimer '1111111' – Jester

+0

@Jester Je ne pouvais rien voir d'autre avec ça. Il se peut que la machine de l'OP ne s'imprime qu'une fois qu'elle a atteint un caractère de retour à la ligne ou quelque chose à faire avec des mots devant être alignés sur 4 octets. – cdo256

+0

Ahha, vous avez raison, c'est un problème, car il écrase non seulement la fin de la ligne, il écrase également la longueur stockée dans la mémoire directement après la chaîne. – Jester