开启辅助访问 切换到宽版

精易论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

用微信号发送消息登录论坛

新人指南 邀请好友注册 - 我关注人的新帖 教你赚取精币 - 每日签到


求职/招聘- 论坛接单- 开发者大厅

论坛版规 总版规 - 建议/投诉 - 应聘版主 - 精华帖总集 积分说明 - 禁言标准 - 有奖举报

查看: 215|回复: 6
收起左侧

[易语言] 删首尾换行符汇编,谁有

[复制链接]
结帖率:82% (80/98)
发表于 昨天 15:35 | 显示全部楼层 |阅读模式   浙江省宁波市
5精币

删首尾换行符汇编,谁有?


回答提醒:如果本帖被关闭无法回复,您有更好的答案帮助楼主解决,请发表至 源码区 可获得加分喔。
友情提醒:本版被采纳的主题可在 申请荣誉值 页面申请荣誉值,获得 1点 荣誉值,荣誉值可兑换荣誉会员、终身vip用户组。
快捷通道:申请荣誉值无答案申请取消悬赏投诉有答案未采纳为最佳
结帖率:0% (0/1)

签到天数: 10 天

发表于 昨天 15:52 | 显示全部楼层   河北省石家庄市
删首尾换行符汇编
回复

使用道具 举报

结帖率:93% (13/14)

签到天数: 14 天

发表于 昨天 16:00 | 显示全部楼层   重庆市重庆市
自己写一个
回复

使用道具 举报

结帖率:82% (80/98)

签到天数: 14 天

 楼主| 发表于 昨天 17:42 | 显示全部楼层   浙江省宁波市
删首尾空 和 删首尾换行符,这两种最好合并,谁会扣汇编?
回复

使用道具 举报

结帖率:75% (3/4)

签到天数: 15 天

发表于 昨天 19:16 | 显示全部楼层   浙江省温州市
  
子程序名返回值类型公开备 注
删首尾空_ASM文本型 删首尾空
参数名类 型参考可空数组备 注
str通用型支持文本型  或 文本型指针
变量名类 型静态数组备 注
Heap整数型 
len整数型 
置入代码 ({ 81, 82, 83, 86, 87, 49, 192, 139, 69, 8, 139, 0, 133, 192, 116, 69, 141, 80, 3, 139, 56, 131, 192, 4, 141, 143, 255, 254, 254, 254, 247, 215, 33, 249, 129, 225, 128, 128, 128, 128, 117, 23, 139, 56, 131, 192, 4, 141, 143, 255, 254, 254, 254, 247, 215, 33, 249, 129, 225, 128, 128, 128, 128, 116, 210, 247, 193, 128, 128, 0, 0, 117, 6, 193, 233, 16, 131, 192, 2, 208, 225, 25, 208, 235, 11, 95, 94, 91, 90, 89, 137, 236, 93, 194, 4, 0, 64, 137, 69, 248, 137, 195, 100, 139, 13, 48, 0, 0, 0, 139, 73, 24, 137, 77, 252 })
' *** 缩略程序块 ***
' push ecx
' push edx
' push ebx
' push esi
' push edi
' xor eax,eax
' mov eax, dword [ebp+0x08]
' mov eax, dword [eax]
' test eax,eax
' je label4
' lea edx, dword [eax+0x03]
' label1:
' mov edi, dword [eax]
' add eax, 0x04
' lea ecx, dword [edi-0x01010101]
' not edi
' and ecx, edi
' and ecx, 0x80808080
' jne label2
' mov edi, dword [eax]
' add eax, 0x04
' lea ecx, dword [edi-0x01010101]
' not edi
' and ecx, edi
' and ecx, 0x80808080
' je label1
' label2:
' test ecx, 0x00008080
' jne label3
' shr ecx, 0x10
' add eax, 0x02
' label3:
' shl cl, 1
' sbb eax, edx
' jmp label5
' label4:
' pop edi
' pop esi
' pop ebx
' pop edx
' pop ecx
' mov esp,ebp
' pop ebp
' ret 4
' label5:
' inc eax
' mov dword[ebp-0x08],eax
' mov ebx,eax
' mov ecx, dword [fs:0x00000030]
' mov ecx, dword [ecx+0x18]
' mov dword[ebp-0x04],ecx
RtlAllocateHeap (Heap, 0, len)
置入代码 ({ 137, 199, 133, 192, 116, 50, 139, 117, 8, 139, 54, 128, 62, 32, 116, 7, 128, 62, 161, 116, 2, 235, 3, 70, 235, 241, 49, 210, 49, 201, 128, 60, 50, 32, 116, 14, 128, 60, 50, 161, 116, 8, 128, 60, 50, 0, 116, 5, 137, 209, 66, 235, 233, 65, 243, 164, 198, 7, 0, 95, 94, 91, 90, 89, 137, 236, 93, 194, 4, 0 })
' *** 缩略程序块 ***
' mov edi, eax
' test eax, eax
' je label7
' mov esi, dword [ebp+0x08]
' mov esi, dword [esi]
' label1:
' cmp byte [esi], 0x20
' je label2
' cmp byte [esi], 0xA1
' je label2
' jmp label3
' label2:
' inc esi
' jmp label1
' label3:
' xor edx, edx
' xor ecx, ecx
' label4:
' cmp byte [edx+esi], 0x20
' je label5
' cmp byte [edx+esi], 0xA1
' je label5
' cmp byte [edx+esi], 0x00
' je label6
' mov ecx, edx
' label5:
' inc edx
' jmp label4
' label6:
' inc ecx
' rep movsb
' label7:
' mov byte [edi], 0x00
' pop edi
' pop esi
' pop ebx
' pop edx
' pop ecx
' mov esp, ebp
' pop ebp
' retn 0x0004
返回 (“”)
子程序名返回值类型公开备 注
删全部空_ASM文本型 删全部空
参数名类 型参考可空数组备 注
str通用型支持文本型  或 文本型指针
变量名类 型静态数组备 注
Heap整数型 
len整数型 
置入代码 ({ 81, 82, 83, 86, 87, 49, 192, 139, 69, 8, 139, 0, 133, 192, 116, 69, 141, 80, 3, 139, 56, 131, 192, 4, 141, 143, 255, 254, 254, 254, 247, 215, 33, 249, 129, 225, 128, 128, 128, 128, 117, 23, 139, 56, 131, 192, 4, 141, 143, 255, 254, 254, 254, 247, 215, 33, 249, 129, 225, 128, 128, 128, 128, 116, 210, 247, 193, 128, 128, 0, 0, 117, 6, 193, 233, 16, 131, 192, 2, 208, 225, 25, 208, 235, 11, 95, 94, 91, 90, 89, 137, 236, 93, 194, 4, 0, 64, 137, 69, 248, 137, 195, 100, 139, 13, 48, 0, 0, 0, 139, 73, 24, 137, 77, 252 })
' *** 缩略程序块 ***
' push ecx
' push edx
' push ebx
' push esi
' push edi
' xor eax,eax
' mov eax, dword [ebp+0x08]
' mov eax, dword [eax]
' test eax,eax
' je label4
' lea edx, dword [eax+0x03]
' label1:
' mov edi, dword [eax]
' add eax, 0x04
' lea ecx, dword [edi-0x01010101]
' not edi
' and ecx, edi
' and ecx, 0x80808080
' jne label2
' mov edi, dword [eax]
' add eax, 0x04
' lea ecx, dword [edi-0x01010101]
' not edi
' and ecx, edi
' and ecx, 0x80808080
' je label1
' label2:
' test ecx, 0x00008080
' jne label3
' shr ecx, 0x10
' add eax, 0x02
' label3:
' shl cl, 1
' sbb eax, edx
' jmp label5
' label4:
' pop edi
' pop esi
' pop ebx
' pop edx
' pop ecx
' mov esp,ebp
' pop ebp
' ret 4
' label5:
' inc eax
' mov dword[ebp-0x08],eax
' mov ebx,eax
' mov ecx, dword [fs:0x00000030]
' mov ecx, dword [ecx+0x18]
' mov dword[ebp-0x04],ecx
RtlAllocateHeap (Heap, 0, len)
置入代码 ({ 137, 199, 133, 192, 116, 26, 139, 117, 8, 139, 54, 128, 62, 32, 116, 13, 128, 62, 161, 116, 8, 128, 62, 0, 116, 6, 164, 235, 238, 70, 235, 235, 198, 7, 0, 95, 94, 91, 90, 89, 137, 236, 93, 194, 4, 0 })
' *** 缩略程序块 ***
' mov edi, eax
' test eax, eax
' je label3
' mov esi, dword [ebp+0x08]
' mov esi, dword [esi]
' label1:
' cmp byte [esi], 0x20
' je label2
' cmp byte [esi], 0xA1
' je label2
' cmp byte [esi], 0x00
' je label3
' movsb
' jmp label1
' label2:
' inc esi
' jmp label1
' label3:
' mov byte [edi], 0x00
' pop edi
' pop esi
' pop ebx
' pop edx
' pop ecx
' mov esp, ebp
' pop ebp
' retn 0x0004
返回 (“”)
回复

使用道具 举报

结帖率:55% (11/20)

签到天数: 8 天

发表于 12 小时前 | 显示全部楼层   浙江省湖州市
### 汇编语言删除字符串首尾换行符实现

以下是几种常见架构的汇编代码实现,用于删除字符串首尾的换行符(LF, 0x0A)。


### 一、x86_64 NASM 实现

```asm
; 删除字符串首尾换行符
; 参数: rdi = 字符串地址, rsi = 字符串长度
; 返回: rdx = 处理后的字符串长度

section .text
global remove_newlines

remove_newlines:
    ; 保存寄存器
    push    rcx
    push    r8
    push    r9
   
    ; 初始化指针和计数器
    mov     rcx, rdi            ; 指向字符串开始
    mov     r8, rdi             ; 指向当前处理位置
    add     r8, rsi             ; 指向字符串末尾
    dec     r8                  ; 指向最后一个字符
    mov     rdx, rsi            ; 初始化新长度为原长度
   
    ; 删除尾部换行符
.loop_tail:
    cmp     rdx, 0              ; 检查是否已处理完所有字符
    jle     .remove_head        ; 如果长度为0,直接处理头部
   
    mov     al, [r8]            ; 获取当前字符
    cmp     al, 0x0A            ; 检查是否为换行符
    jne     .remove_head        ; 如果不是,开始处理头部
   
    ; 是换行符,删除它
    dec     r8                  ; 移动指针向前
    dec     rdx                 ; 减少长度
    jmp     .loop_tail          ; 继续检查下一个字符

.remove_head:
    ; 删除头部换行符
    mov     r9, rcx             ; 保存原始字符串指针
.loop_head:
    cmp     rdx, 0              ; 检查是否已处理完所有字符
    jle     .done               ; 如果长度为0,结束处理
   
    mov     al, [rcx]           ; 获取当前字符
    cmp     al, 0x0A            ; 检查是否为换行符
    jne     .move_chars         ; 如果不是,开始移动字符
   
    ; 是换行符,删除它
    inc     rcx                 ; 移动指针向后
    dec     rdx                 ; 减少长度
    jmp     .loop_head          ; 继续检查下一个字符

.move_chars:
    ; 如果有字符被删除,需要移动剩余字符
    cmp     rcx, r9             ; 检查是否需要移动(头部有删除)
    je      .done               ; 如果不需要移动,直接结束
   
    mov     r8, r9              ; 目标位置(原字符串开始)
.loop_move:
    cmp     rdx, 0              ; 检查是否已移动完所有字符
    jle     .done               ; 如果长度为0,结束处理
   
    mov     al, [rcx]           ; 获取当前字符
    mov     [r8], al            ; 移动到新位置
    inc     rcx                 ; 源指针后移
    inc     r8                  ; 目标指针后移
    dec     rdx                 ; 减少剩余长度
    jmp     .loop_move          ; 继续移动下一个字符

.done:
    ; 恢复寄存器
    pop     r9
    pop     r8
    pop     rcx
    ret
```


### 二、ARM64 AArch64 实现

```asm
; 删除字符串首尾换行符
; 参数: x0 = 字符串地址, x1 = 字符串长度
; 返回: x0 = 处理后的字符串长度

.global remove_newlines

remove_newlines:
    stp     x29, x30, [sp, #-16]!  ; 保存帧指针和返回地址
    mov     x29, sp                ; 设置帧指针
   
    ; 保存寄存器
    stp     x19, x20, [sp, #-16]!
    stp     x21, x22, [sp, #-16]!
   
    mov     x19, x0                ; 保存字符串地址
    mov     x20, x1                ; 保存字符串长度
    mov     x21, x0                ; 当前处理位置(开始)
    add     x22, x0, x1            ; 指向字符串末尾
    sub     x22, x22, #1           ; 指向最后一个字符
   
    ; 删除尾部换行符
.loop_tail:
    cmp     x20, #0                ; 检查是否已处理完所有字符
    ble     .remove_head           ; 如果长度为0,直接处理头部
   
    ldrb    w2, [x22]              ; 获取当前字符
    cmp     w2, #0x0A              ; 检查是否为换行符
    b.ne    .remove_head           ; 如果不是,开始处理头部
   
    ; 是换行符,删除它
    sub     x22, x22, #1           ; 移动指针向前
    sub     x20, x20, #1           ; 减少长度
    b       .loop_tail             ; 继续检查下一个字符

.remove_head:
    ; 删除头部换行符
    mov     x21, x19               ; 重置为字符串开始
.loop_head:
    cmp     x20, #0                ; 检查是否已处理完所有字符
    ble     .done                  ; 如果长度为0,结束处理
   
    ldrb    w2, [x21]              ; 获取当前字符
    cmp     w2, #0x0A              ; 检查是否为换行符
    b.ne    .move_chars            ; 如果不是,开始移动字符
   
    ; 是换行符,删除它
    add     x21, x21, #1           ; 移动指针向后
    sub     x20, x20, #1           ; 减少长度
    b       .loop_head             ; 继续检查下一个字符

.move_chars:
    ; 如果有字符被删除,需要移动剩余字符
    cmp     x21, x19               ; 检查是否需要移动(头部有删除)
    b.eq    .done                  ; 如果不需要移动,直接结束
   
    mov     x22, x19               ; 目标位置(原字符串开始)
.loop_move:
    cmp     x20, #0                ; 检查是否已移动完所有字符
    ble     .done                  ; 如果长度为0,结束处理
   
    ldrb    w2, [x21]              ; 获取当前字符
    strb    w2, [x22]              ; 移动到新位置
    add     x21, x21, #1           ; 源指针后移
    add     x22, x22, #1           ; 目标指针后移
    sub     x20, x20, #1           ; 减少剩余长度
    b       .loop_move             ; 继续移动下一个字符

.done:
    ; 恢复寄存器
    ldp     x21, x22, [sp], #16
    ldp     x19, x20, [sp], #16
   
    mov     x0, x20                ; 返回处理后的字符串长度
   
    ldp     x29, x30, [sp], #16    ; 恢复帧指针和返回地址
    ret
```


### 三、x86 NASM 32位实现

```asm
; 删除字符串首尾换行符
; 参数: eax = 字符串地址, ebx = 字符串长度
; 返回: ebx = 处理后的字符串长度

section .text
global remove_newlines

remove_newlines:
    ; 保存寄存器
    push    ecx
    push    edx
    push    esi
    push    edi
   
    ; 初始化指针和计数器
    mov     esi, eax            ; 指向字符串开始
    mov     edi, eax            ; 指向当前处理位置
    add     edi, ebx            ; 指向字符串末尾
    dec     edi                 ; 指向最后一个字符
    mov     edx, ebx            ; 初始化新长度为原长度
   
    ; 删除尾部换行符
.loop_tail:
    cmp     edx, 0              ; 检查是否已处理完所有字符
    jle     .remove_head        ; 如果长度为0,直接处理头部
   
    mov     al, [edi]           ; 获取当前字符
    cmp     al, 0x0A            ; 检查是否为换行符
    jne     .remove_head        ; 如果不是,开始处理头部
   
    ; 是换行符,删除它
    dec     edi                 ; 移动指针向前
    dec     edx                 ; 减少长度
    jmp     .loop_tail          ; 继续检查下一个字符

.remove_head:
    ; 删除头部换行符
    mov     ecx, esi            ; 保存原始字符串指针
.loop_head:
    cmp     edx, 0              ; 检查是否已处理完所有字符
    jle     .done               ; 如果长度为0,结束处理
   
    mov     al, [esi]           ; 获取当前字符
    cmp     al, 0x0A            ; 检查是否为换行符
    jne     .move_chars         ; 如果不是,开始移动字符
   
    ; 是换行符,删除它
    inc     esi                 ; 移动指针向后
    dec     edx                 ; 减少长度
    jmp     .loop_head          ; 继续检查下一个字符

.move_chars:
    ; 如果有字符被删除,需要移动剩余字符
    cmp     esi, ecx            ; 检查是否需要移动(头部有删除)
    je      .done               ; 如果不需要移动,直接结束
   
    mov     edi, ecx            ; 目标位置(原字符串开始)
.loop_move:
    cmp     edx, 0              ; 检查是否已移动完所有字符
    jle     .done               ; 如果长度为0,结束处理
   
    mov     al, [esi]           ; 获取当前字符
    mov     [edi], al           ; 移动到新位置
    inc     esi                 ; 源指针后移
    inc     edi                 ; 目标指针后移
    dec     edx                 ; 减少剩余长度
    jmp     .loop_move          ; 继续移动下一个字符

.done:
    ; 恢复寄存器
    pop     edi
    pop     esi
    pop     edx
    pop     ecx
   
    mov     ebx, edx            ; 返回处理后的字符串长度
    ret
```


### 使用说明

这些代码实现了相同的功能:删除字符串首尾的换行符(LF, 0x0A)。函数接受字符串地址和长度作为输入,返回处理后的字符串长度。如果有头部换行符被删除,函数会将剩余字符前移以覆盖被删除的字符。

调用示例(C语言伪代码):

```c
char str[] = "\n\nHello World!\n\n";
int len = strlen(str);
// 调用汇编函数:remove_newlines(str, len)
len = remove_newlines(str, len);
str[len] = '\0';  // 添加字符串结束符
printf("处理后的字符串: '%s'\n", str);  // 输出: "Hello World!"
```

根据你的架构选择对应的汇编代码,这些实现都采用了高效的算法,时间复杂度为O(n)。
回复

使用道具 举报

结帖率:82% (80/98)

签到天数: 14 天

 楼主| 发表于 4 小时前 | 显示全部楼层   浙江省宁波市
appleqc 发表于 2025-6-15 10:03
### 汇编语言删除字符串首尾换行符实现

以下是几种常见架构的汇编代码实现,用于删除字符串首尾的换行符( ...

能给置入代码吗?我转不了
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则 致发广告者

发布主题 收藏帖子 返回列表

sitemap| 易语言源码| 易语言教程| 易语言论坛| 易语言模块| 手机版| 广告投放| 精易论坛
拒绝任何人以任何形式在本论坛发表与中华人民共和国法律相抵触的言论,本站内容均为会员发表,并不代表精易立场!
论坛帖子内容仅用于技术交流学习和研究的目的,严禁用于非法目的,否则造成一切后果自负!如帖子内容侵害到你的权益,请联系我们!
防范网络诈骗,远离网络犯罪 违法和不良信息举报电话0663-3422125,QQ: 793400750,邮箱:wp@125.la
网站简介:精易论坛成立于2009年,是一个程序设计学习交流技术论坛,隶属于揭阳市揭东区精易科技有限公司所有。
Powered by Discuz! X3.4 揭阳市揭东区精易科技有限公司 ( 粤ICP备12094385号-1) 粤公网安备 44522102000125 增值电信业务经营许可证 粤B2-20192173

快速回复 返回顶部 返回列表