2009-11-04 3 views
0
.section .data 
msgI: 
.ascii "x = y\n" 
msgI_end: 


msgM: 
.ascii "x > y\n" 
msgM_end: 


msgL: 
.ascii "x < y\n" 
msgL_end: 


.section .text 
.globl main 
main: 
    movl $5, %eax   #x = 5 
    movl $5, %ebx   #y = 10 
    cmp %ebx, %eax 

    je IGUAL 

    jg MAYOR 

    jl MENOR 

IGUAL:      #Esta seccion de cogido se encarga 
    movl $4, %eax   #de imprimir si x = y usando  
    movl $1, %ebx   #los system calls de Linux  
    pushl $msgI 
    call printf    
    #movl $size, %edx   
    int $0x80       
    jmp EXIT 

MAYOR:      #Esta seccion de cogido se encarga 
    movl $4, %eax   #de imprimir si x > y usando  
    movl $1, %ebx   #los system calls de Linux  
    pushl $msgM 
    call printf    
    #movl $size, %edx   
    int $0x80       
    jmp EXIT 

MENOR:      #Esta seccion de cogido se encarga 
    movl $4, %eax   #de imprimir si x < y usando  
    movl $1, %ebx   #los system calls de Linux  
    pushl $msgL 
    call printf    
    #movl $size, %edx   
    int $0x80       
    jmp EXIT 

EXIT: 
    movl $1, %eax   #System calls para salir del programa 
    int $0x80 
+0

Donc, il n'imprime pas msgI comme prévu? –

+0

Y a-t-il une question? – bluebrother

Répondre

2
movl $5, %ebx     #y = 10 

code ne correspond pas à des commentaires. Pourquoi appelles-tu l'interruption? Pourquoi? printf est déjà terminé l'impression et a remplacé les registres comme %eax.

Maintenant, la raison pour laquelle vous recevez vos messages sont tous mélangés: printf prend une chaîne terminée par NUL. S'il ne voit pas de '\0', il continue à fonctionner. Solution: ajoutez un \0 à la fin de vos chaînes msg*. printf va alors arrêter l'impression.

+0

J'ai oublié cela plus tôt, mais si vous utilisez NASM: en utilisant '.asciiz" abc "' est équivalent à '.ascii" abc \ 0 "'. Ce que vous choisissez est à vous. – ephemient