在 M68k 中检查字符串是否为字母数字
Checking if a string is alphanumeric in M68k
我觉得这是一件比较容易做的事情,但是我不知道该怎么做。对于我的作业,您不能使用结构化控制命令(If - Then - Else - Endif;If - Then - Endif)。所以我必须使用分支机构。下面是我一直用来检查字符边界的内容(A0 包含我正在检查的字符串末尾的地址,D0 是字符串的长度)
str_chk MOVE.B -(A0),D1 ; get current character from memory
CMP.B #,D1 ; check if character is less than ASCII '0'
BLO err_range
CMP.B #,D1 ; check if character is greater than ASCII '9'
BHI err_range
SUBQ #1,D0
BNE str_chk
由于小写和大写字母超出此范围,它们将导致错误。我可以做些什么来解决这个问题吗?我应该只有粗略的代码和一堆像
这样的语句吗?
CMP.B #A,D1
BEQ err_range
对于30到7A之间的13个左右的非字母字符。
这样的事情怎么样:
str_chk MOVE.B -(A0),D1 ; get current character from memory
CMP.B #,D1 ; check if character is less than ASCII '0'
BLO err_range
CMP.B #,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'
.[=16 进行比较=]
我觉得这是一件比较容易做的事情,但是我不知道该怎么做。对于我的作业,您不能使用结构化控制命令(If - Then - Else - Endif;If - Then - Endif)。所以我必须使用分支机构。下面是我一直用来检查字符边界的内容(A0 包含我正在检查的字符串末尾的地址,D0 是字符串的长度)
str_chk MOVE.B -(A0),D1 ; get current character from memory
CMP.B #,D1 ; check if character is less than ASCII '0'
BLO err_range
CMP.B #,D1 ; check if character is greater than ASCII '9'
BHI err_range
SUBQ #1,D0
BNE str_chk
由于小写和大写字母超出此范围,它们将导致错误。我可以做些什么来解决这个问题吗?我应该只有粗略的代码和一堆像
这样的语句吗?CMP.B #A,D1
BEQ err_range
对于30到7A之间的13个左右的非字母字符。
这样的事情怎么样:
str_chk MOVE.B -(A0),D1 ; get current character from memory
CMP.B #,D1 ; check if character is less than ASCII '0'
BLO err_range
CMP.B #,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'
.[=16 进行比较=]