假設您有一個存儲在EAX
中的號碼。我如何檢查這個數字是否代表大寫字符?如何檢查數字是否代表NASM裝配中的大寫字符?
坦率地說,我還沒有嘗試過任何東西。我最接近的想法是創建一個大寫字母數組('A','B','C',D',...),然後檢查EAX
是否等於這些中的任何一個。在NASM Assembly中有更簡單的方法嗎?
我正在使用64位CentOS,用於32位程序。
假設您有一個存儲在EAX
中的號碼。我如何檢查這個數字是否代表大寫字符?如何檢查數字是否代表NASM裝配中的大寫字符?
坦率地說,我還沒有嘗試過任何東西。我最接近的想法是創建一個大寫字母數組('A','B','C',D',...),然後檢查EAX
是否等於這些中的任何一個。在NASM Assembly中有更簡單的方法嗎?
我正在使用64位CentOS,用於32位程序。
ASCII字符,像這樣的工作:
cmp eax,'A'
setnc bl ; bl = (eax >= 'A') ? 1 : 0
cmp eax,'Z'+1
setc bh ; bh = (eax <= 'Z') ? 1 : 0
and bl,bh ; bl = (eax >= 'A' && eax <= 'Z')
; bl now contains 1 if eax contains an uppercase letter, and 0 otherwise
如果你的角色是用ASCII編碼的,那麼你可以檢查EAX
的範圍是65到90('A'到'Z')。對於其他編碼(在primis中使用Unicode,請考慮變音符號)我認爲答案根本不重要,您最終應該使用操作系統中的API。
邁克爾的回答有略爲簡單版本,假設你可以揍al
:
sub al, 'A'
cmp al, 'Z' + 1 - 'A'
setc al ; al now contains 1 if al contained an uppercase letter, and 0 otherwise
如果你想分支,然後更換視情況而定,setc
與jc
或jnc
。
'setnc'和'setc'做了什麼? Google對我的幫助不大。 – Voldemort
如果您搜索「SETCC」(在條件代碼中設置),或者在英特爾手冊中查找它們,您可能會發現一些內容。如果進位標誌置位,則SETC將操作數設置爲1,否則設置爲0。如果進位標誌清除,則SETCON將操作數設置爲1,否則設置爲0。 ('cmp'指示「unsigned less than」後的進位,反之沒有進位表示「unsigned大於等於」) – Michael
小寫檢查是否相同,但用'a'和'z'代替? – Voldemort