我一直在做这个程序,我必须输入一个字符串,然后显示该字符串中的字符分布。
例如:
如果输入是“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/