在 C 語言內聯組語中判斷輸入字串是否符合「一個或多位數字後接字母 'a'」模式(如 `1a`, `20a`, `123a`)。
因組語無現成正則引擎,建議在 C 層面用 `sscanf` 或手寫解析,僅將關鍵比較下放至組語。但若教學要求純組語實現,可參考以下邏輯:
int is_digit_a(const char *s) {
int result = 0;
__asm__ (
"movl %1, %%esi\n" // 字串指標 -> ESI
"xorl %%eax, %%eax\n" // EAX = 0 (結果)
"xorl %%ecx, %%ecx\n" // ECX = 0 (狀態: 0=未讀數字, 1=已讀數字)
"1:\n"
"movb (%%esi), %%dl\n" // 讀取字元 -> DL
"testb %%dl, %%dl\n" // 檢查結束符
"je 2f\n"
"cmpb $'0', %%dl\n"
"jl 3f\n"
"cmpb $'9', %%dl\n"
"jg 3f\n"
"movl $1, %%ecx\n" // 讀到數字,狀態=1
"jmp 4f\n"
"3:\n"
"cmpl $1, %%ecx\n" // 狀態=1 才接受 'a'
"jne 2f\n"
"cmpb $'a', %%dl\n"
"jne 2f\n"
"movl $1, %%eax\n" // 成功
"jmp 2f\n"
"4:\n"
"incl %%esi\n" // 下一字元
"jmp 1b\n"
"2:\n"
"movl %%eax, %0\n" // 回傳結果
: "=r" (result)
: "r" (s)
: "%esi", "%eax", "%ecx", "%edx", "memory"
);
return result;
}
int is_digit_a(const char *s) {
int n = 0;
return (sscanf(s, "%da", &n) == 1) && s[strspn(s, "0123456789")] == 'a' && s[strspn(s, "0123456789")+1] == '\0';
}
或手寫迴圈,清晰且效能足夠。
理解組語邏輯有助於底層除錯,但生產環境請使用高階語言標準庫或正則表達式。