String 在M68k中检查字符串是否为字母数字

String 在M68k中检查字符串是否为字母数字,string,assembly,alphanumeric,68000,String,Assembly,Alphanumeric,68000,我觉得这是一件相对容易的事情,但我不知道该怎么做。对于我的作业,您不能使用结构化控制命令If-Then-Else-Endif;If-Then-Endif。所以我得用树枝。下面是我用来检查字符边界的内容A0包含我正在检查的字符串结尾的地址,D0是字符串的长度 str_chk MOVE.B -(A0),D1 ; get current character from memory CMP.B #$30,D1 ; check if characte

我觉得这是一件相对容易的事情,但我不知道该怎么做。对于我的作业,您不能使用结构化控制命令If-Then-Else-Endif;If-Then-Endif。所以我得用树枝。下面是我用来检查字符边界的内容A0包含我正在检查的字符串结尾的地址,D0是字符串的长度

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个左右非字母字符

像这样的东西怎么样:

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”进行比较