在 C 語言內聯彙編中,需判斷用戶輸入字符串是否符合「一個或多個數字後跟單個字母 'a'」模式(如 1a、20a、100a)。
彙編無正則引擎,需手工實現字符級解析:
ESI/RDI)。'0' <= ch <= '9'(CMP + JL/JG),非數字則跳轉失敗;計數器累加數字位數。ch == 'a' || ch == 'A'。\0(字符串結束),否則格式錯誤。EAX=1,失敗置 EAX=0,返回 C 語言。__asm__ (
"mov %1, %%rdi\n" // 字符串指針 -> RDI
"xor %%rax, %%rax\n" // RAX=0 (預設失敗)
"xor %%rcx, %%rcx\n" // RCX=0 (數字計數)
"1:\n"
"movb (%%rdi), %%al\n" // 讀取字符
"test %%al, %%al\n" // 檢查 \0
"je 2f\n" // 過早結束 -> 失敗
"cmpb $'0', %%al\n"
"jl 2f\n"
"cmpb $'9', %%al\n"
"jg 3f\n" // 非數字,進入字母檢查
"inc %%rdi\n" // 指針後移
"inc %%rcx\n" // 數字計數++
"jmp 1b\n" // 繼續掃描數字
"3:\n"
"cmpb $'a', %%al\n"
"je 4f\n"
"cmpb $'A', %%al\n"
"jne 2f\n" // 非 a/A -> 失敗
"4:\n"
"inc %%rdi\n"
"movb (%%rdi), %%al\n" // 檢查下一字符必須為 \0
"test %%al, %%al\n"
"jne 2f\n"
"cmp $1, %%rcx\n" // 至少一位數字
"jl 2f\n"
"mov $1, %%rax\n" // 成功 RAX=1
"2:\n"
: "=a" (result) // 輸出
: "r" (str) // 輸入
: "rdi", "rcx", "al", "memory" // 破壞寄存器
);
sscanf(str, \"%d%c\", &num, &ch) == 2 && ch == 'a' 可讀性高、編譯器優化好、跨平台。%0, %1)綁定 C 變量,而非硬編碼棧偏移。內聯彙編是「核武器級」工具,僅在極致性能、硬件交互或教學驗證時使用;日常字符串解析,C 標準庫才是正道。