首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

彙編判斷「數字+字母」格式:正則思維在彙編中的落地與替代方案

     編輯:程式設計綜合問答

問題本質

在純彙編(非內聯)中判斷輸入字符串是否匹配「數字後跟字母 a」模式。提問者為初學者,尋求思路。

正則表達式視角的啟發

模式對應正則:^[0-9]+[aA]$。彙編無正則引擎,需手動實現**確定性有限自動機 (DFA)**:

狀態 0 (初始) --[0-9]--> 狀態 1 (讀到數字)
狀態 1 --[0-9]--> 狀態 1
狀態 1 --[aA]--> 狀態 2 (接受狀態)
狀態 2 --[\0]--> 成功
其他轉移 --> 失敗

彙編實現關鍵點

  1. 字符獲取: lodsb (加載字符串字節至 AL,ESI 自增) 或手動 mov al, [esi]; inc esi。
  2. 範圍比較: cmp al, '0' / jl fail;cmp al, '9' / jg check_alpha。
  3. 字母判斷: cmp al, 'a' / je accept;cmp al, 'A' / je accept。
  4. 結束符檢查: 接受狀態下 cmp byte [esi], 0 / jne fail。
  5. 返回值: eax=1 成功,eax=0 失敗。

教學級代碼片段 (NASM x86_64 Linux)

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

工程建議

  • **學習階段**:手寫 DFA 彙編代碼極佳鍛煉底層邏輯思維。
  • **生產環境**:**嚴禁**手寫彙編解析器。使用成熟庫:C regex.h (POSIX)、C++ <regex>、Rust regex crate、Go regexp。性能足夠、安全性高、可維護。
  • **跨平台**:彙編綁定指令集 (x86/ARM),移植成本極高。

以「正則→DFA→彙編」為學習路徑理解計算模型,以「成熟庫」為生產工具解決實際問題,是工程師的成熟標誌。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved