2013-10-23 15 views
0

假設您有一個存儲在EAX中的號碼。我如何檢查這個數字是否代表大寫字符?如何檢查數字是否代表NASM裝配中的大寫字符?

坦率地說,我還沒有嘗試過任何東西。我最接近的想法是創建一個大寫字母數組('A','B','C',D',...),然後檢查EAX是否等於這些中的任何一個。在NASM Assembly中有更簡單的方法嗎?

我正在使用64位CentOS,用於32位程序。

回答

1

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 
+0

'setnc'和'setc'做了什麼? Google對我的幫助不大。 – Voldemort

+1

如果您搜索「SETCC」(在條件代碼中設置),或者在英特爾手冊中查找它們,您可能會發現一些內容。如果進位標誌置位,則SETC將操作數設置爲1,否則設置爲0。如果進位標誌清除,則SETCON將操作數設置爲1,否則設置爲0。 ('cmp'指示「unsigned less than」後的進位,反之沒有進位表示「unsigned大於等於」) – Michael

+0

小寫檢查是否相同,但用'a'和'z'代替? – Voldemort

3

如果你的角色是用ASCII編碼的,那麼你可以檢查EAX的範圍是65到90('A'到'Z')。對於其他編碼(在primis中使用Unicode,請考慮變音符號)我認爲答案根本不重要,您最終應該使用操作系統中的API。

0

邁克爾的回答有略爲簡單版本,假設你可以揍al

sub al, 'A' 
cmp al, 'Z' + 1 - 'A' 
setc al ; al now contains 1 if al contained an uppercase letter, and 0 otherwise 

如果你想分支,然後更換視情況而定,setcjcjnc

相關問題