2015-02-06 66 views
0

我觉得这是一件相对容易的事,但我不知道该怎么做。对于我的任务,你不能使用结构化控制命令(If - Then - Else - Endif; If - Then - Endif)。所以我必须使用分支。下面是我一直在使用来检查字符范围(A0包含我检查字符串结尾的地址,D0是字符串的长度)检查一个字符串是否是M68k中的字母数字

str_chk MOVE.B  -(A0),D1  ; get current character from memory 
     CMP.B  #$30,D1  ; check if character is less than ASCII '0' 
     BLO  err_range 
     CMP.B  #$39,D1  ; check if character is greater than ASCII '9' 
     BHI  err_range 
     SUBQ  #1,D0 
     BNE  str_chk 

由于小写和大写字母是什么高于这个范围,他们会导致错误。我能做些什么来解决这个问题吗?我是不是应该有毛的代码,并且有类似

CMP.B #$3A,D1 
BEQ  err_range 

30和7A之间的13个左右的非字母字符的一串语句。

回答

0

怎么是这样的:

str_chk MOVE.B  -(A0),D1  ; get current character from memory 
     CMP.B  #$30,D1  ; check if character is less than ASCII '0' 
     BLO  err_range 
     CMP.B  #$39,D1  ; check if character is greater than ASCII '9' 
     BLS  is_alnum 
     ; It wasn't a digit. Check if it's in the range 'A'..'Z' or 'a'..'z' 
     ANDI  #$DF,D1  ; convert to uppercase 
     CMP.B  #65,D1  ; 'A' 
     BLO  err_range ; > '9' but < 'A': not alphanumeric 
     CMP.B  #90,D1  ; 'Z' 
     BHI  err_range ; > 'Z': not alphanumeric 
is_alnum 
     SUBQ  #1,D0 
     BNE  str_chk 

首先D1进行检查,看它是否包含一个数字。如果没有,我们检查它是否包含'A'..'Z''a'..'z'。大写字母和小写字母之间的唯一区别是第5位是为小写字母设置的,所以我们用ANDI指令清除第5位,这样我们只需要与'A'..'Z'进行比较。

相关问题