在純彙編(非內聯)中判斷輸入字符串是否匹配「數字後跟字母 a」模式。提問者為初學者,尋求思路。
模式對應正則:^[0-9]+[aA]$。彙編無正則引擎,需手動實現**確定性有限自動機 (DFA)**:
狀態 0 (初始) --[0-9]--> 狀態 1 (讀到數字)
狀態 1 --[0-9]--> 狀態 1
狀態 1 --[aA]--> 狀態 2 (接受狀態)
狀態 2 --[\0]--> 成功
其他轉移 --> 失敗
lodsb (加載字符串字節至 AL,ESI 自增) 或手動 mov al, [esi]; inc esi。cmp al, '0' / jl fail;cmp al, '9' / jg check_alpha。cmp al, 'a' / je accept;cmp al, 'A' / je accept。cmp byte [esi], 0 / jne fail。eax=1 成功,eax=0 失敗。section .text
global check_format
check_format:
mov rsi, rdi ; 參數1: 字符串指針 -> RSI
xor eax, eax ; 預設返回 0
xor ecx, ecx ; 數字計數器
.next_char:
lodsb ; AL = [RSI++]
test al, al
jz .fail ; 過早結束
cmp al, '0'
jl .check_alpha
cmp al, '9'
jg .check_alpha
inc ecx ; 數字計數++
jmp .next_char
.check_alpha:
cmp al, 'a'
je .check_end
cmp al, 'A'
jne .fail
.check_end:
cmp ecx, 0
jle .fail ; 無數字
cmp byte [rsi], 0 ; 檢查下一字節是否 \0
jne .fail
mov eax, 1 ; 成功
ret
.fail:
xor eax, eax
ret
regex.h (POSIX)、C++ <regex>、Rust regex crate、Go regexp。性能足夠、安全性高、可維護。以「正則→DFA→彙編」為學習路徑理解計算模型,以「成熟庫」為生產工具解決實際問題,是工程師的成熟標誌。