2013-06-06 2 views
1

Selon les définitions NEG et Negu,Mmix NEG et Negu opcodes

NEG $X,Y,$Z (negate signed): s($X) := Y - s($Z). 
NEGU $X,Y,$Z (negate unsigned): u($X) := (Y - u($Z)) mod 2^64. 

Supposons que $Z = s(-1) ou u(2^64 - 1). Alors le premier opcode va mettre la valeur 1 dans le registre $X quand Y = 0, et le dernier donnera le même résultat car u(-(2^64 - 1)) mod 2^64 = 1. Ai-je raison? L'instruction NEG doit-elle déclencher une exception de dépassement de capacité lorsque $Z = -2^63?

Répondre

1

Réponse courte à "L'instruction NEG devrait-elle déclencher une exception de débordement lorsque $ Z = -2^63?"

yes, but you probably already suspected that. 

Logiquement, NEG $ X, 0, -2^63 devrait donner 2^63, ce qui est hors limites pour les nombres entiers positifs signés, et donc trop-pleins. Mais si vous êtes comme moi, vous voulez la preuve qu'un débordement d'entier se produit réellement. Ici, il est:

t  IS  $255 

    LOC  #20   //handle the integer overflow event 
    PUSHJ 255,Err 
    PUT  rJ,$255 
    GET  $255,rB 
    RESUME 

     LOC  #100 
Main SET  t,#4000 
     PUT  rA,t  //set the integer overflow event bit 
     SETH $0,#8000 
     NEG  $1,0,$0 
     GETA t,End 
     TRAP 0,Fputs,StdOut 
     TRAP 0,Halt,0 
End  BYTE "End of program",#a,0 

Err  SET  $0,$255   //overflow subroutine, prints out message 
     GETA t,Emes 
     TRAP 0,Fputs,StdOut 
     GET  t,rW 
     INCL t,4 
     PUT  rW,t 
     SET  $255,$0 
     POP  0,0 
Emes BYTE "Error: integer overflow",#a,0 
+0

Pour le plaisir plus loin, vous pouvez l'exécuter avec MMIX -i program_name.mms pour pouvoir inspecter enregistrer le contenu à chaque étape du chemin – NickO

+0

Soit dit en passant, si vous voulez la confirmation que le code ci-dessus est la façon correcte de gérer le débordement d'entier, consultez [ce post github] (https://github.com/ottocode/MMIX/blob/master/Nim/overflow.mms) – NickO

Questions connexes