需要从汇编中的字符串中删除所有非字母元素

2024-02-18

通过编写此汇编代码,我无法使用此选项来删除非字符字母。它将遍历字符串并进行所有比较,然后显示相同的字符串,且不删除任何非字符。 我正在尝试将字母字符放入 tempString 中,然后将其移动到 edx 进行显示。

它接受一个字符串并删除所有非字母字符
然后使用另一个使用 writestring 并注册 edx 的过程显示新字符串


;// ------------------------------------------------------------------------------
option3 PROC
;// Description: removes all non-letter elements. There is no requirement for
;// option2 to have been executed.
;// Receives: ecx - length of string
;// edx - offset of string
;// ebx - offset of string length variable
;// esi preserved
;// Returns: nothing, but the string will have all non-letter elements removed

.data


.code

push esi
call option5

L3:
mov al, byte ptr [edx+esi]

cmp al, 41h
jb notletter
cmp al, 5Ah
ja notletter
cmp al, 61h
jb notletter
cmp al,7Ah
ja notletter


mov byte ptr [edx+esi], al

notletter:
inc esi
loop L3


pop esi
call option5
call waitmsg

option3 ENDP


首先,将此视为从一个地方复制到同一个地方;其中不复制需要忽略的字节。为此,您需要 2 个寄存器 - 一个用于跟踪从哪里获取下一个字节(例如,也许esi),以及一个用于跟踪存储下一个字节/字母的位置(例如,也许edi).

其次,您的“is it a letter”分支不正确(例如,字母“A”或值 0x41 将小于字母“a”或值 0x61)。它需要更像:

    cmp al,'A'       ;Is the value too low to be any letter?
    jb .notLetter    ; yes
    cmp al,'z'       ;Is the value too high to be any letter?
    ja .notLetter    ; yes
    cmp al,'Z'       ;Is the value low enough to be a capital letter?
    jbe .isLetter    ; yes
    cmp al,'a'       ;Is the value high enough to be a lower case letter?
    jae .isLetter    ; yes
                     ; no, not a letter
.notLetter:

例如(NASM):

;Inputs:
; ecx    Length of original string
; esi    Address of original string
;
;Outputs
; edi    Length of new string
; ebx    Address of new string

filterString:
    mov edi,esi      ;edi = address to store string (same address as original string)
    mov ebx,esi      ;ebx = address of both strings (used later)
    jecxz .done      ;Do nothing if the original string has zero length
    cld

.nextByte:
    lodsb            ;AL = next byte, ESI incremented
    cmp al,'A'       ;Is the value too low to be any letter?
    jb .doneByte     ; yes, not a letter
    cmp al,'z'       ;Is the value too high to be any letter?
    ja .doneByte     ; yes, not a letter
    cmp al,'Z'       ;Is the value low enough to be a capital letter?
    jbe .isLetter    ; yes, it's a capital letter
    cmp al,'a'       ;Is the value high enough to be a lower case letter?
    jb .doneByte     ; no, not a letter
                     ; yes, it's a lower case letter
.isLetter:
    stosb            ;Store AL at EDI, and increment EDI

.doneByte:
    loop .nextByte
.done:
    sub edi,ebx      ;edi = length of new string
    ret
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

需要从汇编中的字符串中删除所有非字母元素 的相关文章

  • 程序集比较标志理解

    我正在努力理解汇编程序中的以下代码片段 if EAX gt 5 EBX 1 else EBX 2 在汇编程序中 可以写如下 根据我的书 模拟jge操作说明 https www felixcloutier com x86 jcc您通常会使用
  • CPU寄存器和多任务处理

    我目前正在学习汇编 我很困惑 CPU 寄存器如何与多任务一起工作 所以在多任务系统中 CPU可以随时暂停某个程序的执行并运行另一个程序 那么在这一步中寄存器值是如何保存的呢 寄存器是压入堆栈还是以其他方式 CPU 寄存器如何与多任务一起工作
  • 阴影空间示例

    EDIT 我接受了下面的答案 并添加了我自己的代码的最终修订版 希望它向人们展示影子空间分配的实际示例 而不是更多的文字 编辑 2 我还设法在 YouTube 视频 所有内容 的注释中找到了一个调用约定 PDF 的链接 其中有一些关于 Li
  • 按字节数对向量进行混洗

    有什么办法可以左移 v 0 gt v 1 a m128i by n字节 其中n仅在运行时才知道 我目前仅限于 AVX1 但如果 AVX2 512 使这变得更容易 我非常感兴趣 I found mm bslli si128 m128i imm
  • 是否可以在VM内使用VMX CPU指令?

    VM guest 内部的进程是否有可能使用 VMX AMD V VT x CPU 指令 然后由外部 VMM 处理而不是直接在 CPU 上处理 Edit 假设外部VM使用VMX本身来管理其虚拟客户机 即它在Ring 1中运行 如果可能的话 是
  • 为什么我的代码显示垃圾?

    当我也想打印列表中的每个数字时 我的代码显示垃圾 有什么问题吗 输出应如下所示 给定的数组是 2G 4 PT为什么这是垃圾总数是 7 Code ASSUME CS CODE DS DATA SS STK ORG 0000H DATA SEG
  • 是否可以在Linux上将C转换为asm而不链接libc?

    测试平台为Linux 32位 但也欢迎 Windows 32 位上的某些解决方案 这是一个c代码片段 int a 0 printf d n a 如果我使用 gcc 生成汇编代码 gcc S test c 然后我会得到 movl 0 28 e
  • 在 x86 汇编中将 64 位常量移至内存

    我正在使用 Intel x64 程序集 NASM 编译器 尝试将 0x4000000000000000 常量移至内存 该常量在 ieee 754 标准双精度中应等于 2 0 我正在使用的代码是 define two 0x4000000000
  • 长多字节 NOP:通常理解的宏或其他符号

    x86 和 x86 64 处理器不仅具有单字节 这不是什么大秘密NOP指令 还包括各种类型的多字节类 NOP 指令 这些是我设法找到的 AMD 推荐 参考 AMD 系列 15h 处理器的 AMD 软件优化指南 文档 47414 http s
  • 为什么 Linux perf 使用事件 l1d.replacement 来处理 x86 上的“L1 dcache misses”?

    在英特尔 x86 上 Linux用途 https stackoverflow com a 52172985 149138事件l1d replacements来实施其L1 dcache load misses event 该事件定义如下 计数
  • NASM 中的 equ 和 db 有什么区别?

    len equ 2 len db 2 它们是否相同 产生可以用来代替的标签2 如果不是 那么每种申报表的优点或缺点是什么 它们可以互换使用吗 第一个是equate 与 C 类似 define len 2 因为它实际上并没有在最终代码中分配任
  • 为什么在展开的 ADD 循环内重新初始化寄存器会使其运行速度更快,即使循环内有更多指令?

    我有以下代码 include
  • SIMD 和 VLIW 指令是一样的吗?

    SIMD 单指令多数据 和 VLIW 超长指令字 到底有什么区别 其中一个是另一个的子集吗 或者它们是两个完全不同的东西 完全不相关且正交 一台机器可以有一个或两个 或者两者都没有 SIMD 指令可以作为扩展添加到 VLIW ISA 但 V
  • 为什么X86中没有NAND、NOR和XNOR指令?

    它们是您可以在计算机上执行的最简单的 指令 之一 它们是我亲自实施的第一个指令 执行 NOT AND x y 会使执行时间和依赖链长度和代码大小加倍 BMI1 引入了 andnot 这是一个有意义的补充 是一个独特的操作 为什么不是这个问题
  • movzbl(%rdi, %rcx, 1), %ecx 在 x86-64 汇编中意味着什么?

    我想我明白 movzbl rdi rcx 1 ecx 意思是 将零扩展字节移至长整型 并表示将 ecx 扩展为 32 位 但我不完全确定语法 rdi rcx 1 指的是什么 我在某处看到该语法指的是 Base Index Scale 但我找
  • 汇编器8086将32位数字除以16位数字

    我尝试将 32 位数字除以 16 位数字 例如 10000000h 除以 2000h 根据我尝试做的设计除以 右 4 位数字除以除数 然后左 4 位数字除以除数 这是我的代码 DATA num dd 10000000h divisor dw
  • Clang 编译器 (x86):80 位长双精度

    我正在尝试在 x86 Windows 平台上使用本机 80 位长双精度 海湾合作委员会选项 mlong double 80 https gcc gnu org onlinedocs gcc x86 Options html似乎不适用于 cl
  • Intel:序列化指令和分支预测

    英特尔架构开发人员手册 http www intel com content www us en architecture and technology 64 ia 32 architectures software developer v
  • 如何在WinMobile6上启用ARMv6非对齐访问?

    ARMv6 引入了一个很棒的功能 未对齐的内存访问 这使得代码中的某些事情变得更加简单和更快 但微软只在winCE6中提供了API 现在大多数 PDA 都基于 WinMobile6 基于 CE 5 x 默认情况下禁用未对齐访问 我尝试在 C
  • 在 Intel x86 架构上使用非 AVX 指令移动 xmm 整数寄存器值

    我有以下问题 需要使用 AVX2 以外的任何工具来解决 我有 3 个值存储在 m128i 变量中 不需要第四个值 需要将这些值移动 4 3 5 我需要两个功能 一个用于按这些值进行右逻辑移位 另一个用于左逻辑移位 有谁知道使用 SSE AV

随机推荐