2017-02-01 6 views
0

Je souhaite écrire un programme qui invite l'utilisateur à saisir un caractère du clavier. Pour le caractère entré, classer le caractère comme un nombre, une lettre Si l'utilisateur a entré "*" puis boucle à nouveau pour la nouvelle valeur Le problème est toujours montrer le résultat est le numéro, ce qui n'est pas exact quand j'entre la lettre. J'apprécie toute aide.Structures de décision en langage assembleur 68k

   ORG $1000 
*read user input 
START:  
      MOVEQ #18,D0 
      LEA  PR1,A1 
      TRAP #15 

*COMPARING   
      MOVE.B D1,D2 
      CMP.B #$30,D2     ;if ch less than ASCII '0' 
      BGE  number     
      CMP.B #$39,D2     ;check if ch greater than ASCII '9' 
      BLE  number     
      ANDI #$DF,D2     ;CONVERT TO UPPERCASE 
      CMP.B #65,D2     
      BGE  letter 
      CMP.B #90,D2 
      BLE  letter 
      CMP.B #$2a,D1     ;if user enter * 
      BEQ  START     ;then loop again to enter new value 



number  LEA  n,A1  
      JSR  P_STR   
      MOVE.B #5,D0 
      TRAP #15 
letter  LEA  l,A1 
      JSR  P_STR 
      MOVE.B #5,D0 
      TRAP #15     
PR1   DC.B 'Enter value: ',0 
n   DC.B 'Number',0 
l   DC.B 'Letter',0 
      INCLUDE 'sample.x68' ; it is the file Prints a string withCR/LF   
      END  START 

Répondre

1

Votre logique est incorrecte:

CMP.B #$30,D2     ;if ch less than ASCII '0' 
BGE  number     
CMP.B #$39,D2     ;check if ch greater than ASCII '9' 
BLE  number     

Cela se traduit par:

if (ch >= 0x30 || ch <= 0x39) goto number; 

Qu'est-ce que vous voulez est:

if (ch >= 0x30 && ch <= 0x39) goto number; 

qui ressemblerait à quelque chose comme:

CMP.B #$30,D2 
BLT  not_number 
; We've established that ch>=0x30, not make sure that it's also <=0x39     
CMP.B #$39,D2     
BLE  number 
not_number: 

Votre vérification de lettre pourrait nécessiter un changement similaire; Je n'ai pas pris cette partie du code.

+0

Merci j'apprécie votre aide. Ça marche – nas2016