assembly - 在汇编 x86 中查找字符串中的出现

标签 assembly x86 masm irvine32

我一直在做这个程序,我必须输入一个字符串,然后显示该字符串中的字符分布。

例如:
如果输入是“minecode”,则输出应该是

C – 1
O – 1
D – 1
E – 2
I – 1
M – 1
N – 1

这是我尝试做的,但我真的不知道如何遍历循环并检查相似的字符,然后增加计数。汇编器是在 32 位机器上运行的 MASM 615。

.686
.MODEL flat, stdcall
.STACK
INCLUDE Irvine32.inc
.DATA
  msg0 BYTE "Enter a string of characters: ",0
  msg1 BYTE "Character Distribution: ",0
  MainArray    dword 10000 dup (?)
  UniqueChar   dword 10000 dup (?)
  CharCount    dword 10000 dup (?)
.CODE
MAIN PROC
    lea edx, msg0
    call WriteString
    call dumpregs        ; 1
    call ReadString
    mov MainArray, eax
    call dumpregs        ; 2
    mov MainArray, ebx
    call dumpregs        ; 3
    call CRLF
    lea edx, msg1
    call WriteString
    call CharDist        ; Calls the procedure
    call dumpregs        ; 5
    exit
MAIN ENDP
CharDist PROC
    mov ecx, lengthof MainArray
    mov esi, OFFSET MainArray
    L1:
; what to do here?? 
Loop L1:
CharDist ENDP
END MAIN

最佳答案

一种可能的方法:创建一个由 256 个计数器组成的数组,将其基地址存储在 ebx 中,然后对于字符串中的每个字节,将计数器从 ebx 的偏移量处递增>。然后,循环遍历您的计数器数组并打印非零计数。

你永远不会说这是一个以 0 字节结尾的字符串(C 风格),一个以它的长度开头的字符串(Pascal 风格),还是一个长度作为第二个传入的字符串参数,但这将决定您何时终止循环。如果您正在寻找终止零,请测试您刚刚读取的字节,如果您正在计算特定数量的字节,请保留 ecx 中剩余的字节数并进行测试。 (如果 ecx 不为零,则有条件分支的特殊说明,如果您喜欢使用它们。)

如果您将指向字符串的指针保留在 esi 中,则可以使用 lodsb 指令将下一个字节加载到 al 中。或者,您可以从 [esi] 中的 mov,然后是 inc esi。如果在将每个字节存储到 al 之前将 eax 清零,这将在 eax 中为您提供一个索引,您可以将其与计数器数组一起使用.

关于assembly - 在汇编 x86 中查找字符串中的出现,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40797133/

相关文章:

c - 如何在 ARM 汇编程序中使用 C 定义

c - 使用内存引用的 GCC 内联汇编程序

assembly - GCC 内联汇编器,混合寄存器大小 (x86)

c++ - 关于堆栈增长和寻址的困惑

c++ - 从 C/C++ 代码执行 RDMSR 和 WRMSR 指令

assembly - 如何在汇编时连接字符串(使用 CATSTR?)

macos - Mac OS : ld: in section __DATA, __data reloc 0:长度 < 2 和 X86_64_RELOC_UNSIGNED 不受支持

assembly - 汇编代码和字节码有什么区别?

linux - 没有 stdlib 的汇编器 x86

file - MASM 程序集列表文件 - 解释