2013-07-16 2 views
0

Le code suivant:x86 Assembleur Intel Linux SYS_write + sys_read

section  .bss 

name: resb 50 

section  .text 
global   _start 

_start: 
     PUSH EBP 
     MOV EBP, ESP 
     MOV EDX, len 
     MOV ECX, msg 
     MOV EBX, 1 
     MOV EAX, 4 
     INT 0x80 
     MOV EDX, 50 
     MOV ECX, name 
     MOV EBX, 0 
     MOV EAX, 3 
     INT 0x80 
     MOV EBX, 1 
     MOV EAX, 4 
     INT 0x80 
     MOV EDX, cm 
     MOV ECX, ex 
     MOV EBX, 1 
     MOV EAX, 4 
     INT 0x80 
     MOV EBX, 0 
     MOV EAX, 1 
     INT 0x80 
section  .data 

msg   db 'Hello!',0xa 
ex   db '!',0xa 
len   equ $ - msg 
cm   equ $ - ex 

je comptais faire un programme E/S simple imprimé Hello!, demandé char et imprimerait %c!.

entrée étant | et sortie étant :, je reçois le texte suivant:

:Hello! 

:! 

|4 

:4 

:! 

Comment puis-je faire pour qu'il renvoie les éléments suivants

:Hello! 

|4 

:4! 
+2

Je n'ai écrit aucun assemblage depuis des années, mais ces 'equ's à la fin ressemblent à des chaînes de mesure - donc le' len' devrait venir immédiatement après 'msg'. –

+1

S'il vous plaît pouvez-vous ajouter des commentaires à votre code? Même juste un commentaire pour chaque appel système rendrait cela beaucoup plus facile à lire. – user9876

+1

Appellez-vous le read() syscall pour lire le texte? Cela retournerait "4 \ n", pas seulement "4". Je pense que vous êtes en train de l'imprimer sans enlever le "\ n", c'est pourquoi il y a une nouvelle ligne entre "4" et "!". Mais je fais des conjectures sur ce que fait votre code :-) – user9876

Répondre

1

Comme le dit Damien_The_Unbeliever, vos equ s veulent à venir immédiatement après la chaîne qu'ils sont censés mesurer. Après votre sys_read, eax sera le nombre de caractères lus, y compris le saut de ligne qui termine la lecture. Vous ne voulez probablement pas imprimer le saut de ligne (dans ce cas - parfois vous le feriez). Alors:

mov edx, eax 
dec edx 

Ou si vous voulez le faire dans une instruction:

lea edx, [eax - 1] 

En l'état actuel, edx détient encore 50, de sorte que votre prochain sys_write imprimera 50 caractères. Il ne s'arrêtera pas à zéro ou à toute autre terminaison de chaîne. ecx contiendra toujours name, mais je voudrais le recharger juste pour plus de clarté.

De tous droits, vous devriez vérifier une erreur de retour (eax serait négatif) après chaque int 0x80 mais une erreur est peu probable ici.

Questions connexes