宏汇编实现字母大小写的转换

本文介绍了一个使用汇编语言编写的宏,该宏可以将输入的字符串中的小写字母转换为大写。通过逐个检查字符串中的每个字符并利用条件跳转指令实现字母大小写的转换。
Change      macro  buffer
            lea bx,buffer
again:      mov al,[bx]
            cmp al,'$'
            je done
            cmp al,'a'
            jae next1
            jmp done1
next1:      cmp al,'z'
            ja  done1
            sub al,20h
            mov byte ptr [bx],al
done1:      inc bx
            jmp again
done:
            endm
            

stack     segment
	db 1024 dup(?)
stack     ends

data      segment
	string db 'Please input a string $'
data      ends

code      segment
	assume cs:code,ss:stack,ds:data
	
start:
          mov ax,data
          mov ds,ax
          Change string
          mov ah,09h
          mov dx,offset string
          int 21h
          mov ah,4ch
          int 21h
          
code      ends
end       start
          

在不使用 `strncasecmp` 的情况下实现大小写无关比较,特别适用于 **RTOS、嵌入式系统或资源受限环境**(如 STM32、FreeRTOS、Zephyr 等),我们可以手动实现一个轻量级的函数来逐字符比较,并将大写字母转换为小写后再比对。 --- ### ✅ 目标 实现一个 **不依赖标准库 `strncasecmp`** 的函数,完成大小写无关的字符串前缀比较。 --- ### ✅ 手动实现:`my_strncasecmp` ```c /** * @brief 不区分大小写的字符串前 n 字符比较(自定义实现) * * @param str1 第一个字符串 * @param str2 第二个字符串 * @param n 比较的最大长度 * @return int 0 表示相等,非 0 表示不等 */ int my_strncasecmp(const char* str1, const char* str2, size_t n) { if (n == 0) { return 0; // 长度为0,认为相等 } if (!str1 || !str2) { return (int)((unsigned char)(str1 ? *str1 : 0) - (unsigned char)(str2 ? *str2 : 0)); } size_t i = 0; while (i < n && str1[i] && str2[i]) { char c1 = str1[i]; char c2 = str2[i]; // 转换为小写进行比较 if (c1 >= 'A' && c1 <= 'Z') c1 += ('a' - 'A'); if (c2 >= 'A' && c2 <= 'Z') c2 += ('a' - 'A'); if (c1 != c2) { return (int)((unsigned char)c1 - (unsigned char)c2); } i++; } // 如果其中一个提前结束,则比较剩余字符 if (i < n) { return (int)((unsigned char)str1[i] - (unsigned char)str2[i]); } return 0; // 完全相等 } ``` --- ### ✅ 使用示例:判断是否为 HTTPS 结合你之前的需求,用这个函数判断 URL 是否以 `https://` 开头: ```c int is_https_url(const char* url) { if (!url) return 0; return my_strncasecmp(url, "https://", 8) == 0; } // 测试函数 void test() { printf("%s -> %s\n", "https://example.com", is_https_url("https://example.com") ? "YES" : "NO"); printf("%s -> %s\n", "HTTPS://EXAMPLE.COM", is_https_url("HTTPS://EXAMPLE.COM") ? "YES" : "NO"); printf("%s -> %s\n", "http://example.com", is_https_url("http://example.com") ? "YES" : "NO"); } ``` --- ### 🔍 输出结果 ``` https://example.com -> YES HTTPS://EXAMPLE.COM -> YES http://example.com -> NO ``` --- ### ✅ 优点说明 | 特性 | 说明 | |------|------| | ✅ 无依赖 | 不调用 `strncasecmp`、`tolower` 等库函数 | | ✅ 可移植性强 | 适合裸机、RTOS、MCU | | ✅ 易于优化 | 可内联、裁剪、汇编重写 | | ✅ 边界安全 | 检查空指针和长度限制 | --- ### 💡 小写字母转换原理 ```c if (c >= 'A' && c <= 'Z') c += 'a' - 'A'; // 即 +32 ``` ASCII 中: - `'A' = 65`, `'a' = 97` - 差值为 `32`,所以大写转小写就是 `+32` > ⚠️ 注意:只处理 ASCII 字符,不支持 Unicode(适合 URL 协议字段) --- ### 🛠️ 进一步优化:版本(用于固定字符串) 如果你只比较固定协议头(如 `"https://"`),可以写成展开,提高速度: ```c #define IS_HTTPS_PREFIX(s) \ (((s)[0] == 'h' || (s)[0] == 'H') && \ ((s)[1] == 't' || (s)[1] == 'T') && \ ((s)[2] == 't' || (s)[2] == 'T') && \ ((s)[3] == 'p' || (s)[3] == 'P') && \ ((s)[4] == 's' || (s)[4] == 'S') && \ (s)[5] == ':' && (s)[6] == '/' && (s)[7] == '/' && \ (strlen(s) > 8)) // 使用 if (IS_HTTPS_PREFIX(url)) { ... } ``` > ✅ 极速执行,无循环 > ❌ 不灵活,仅适用于固定模式 ---
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值