繁体   English   中英

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

[英]Checking if a string is alphanumeric in M68k

我觉得这是相对容易做到的事情,但是我不知道该怎么做。 对于我的任务,您不能使用结构化的控制命令(如果-然后-其他-Endif;如果-然后-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'进行比较。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM