[英]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.