Assembly 制作频率表
我应该创建一个包含256个DWORD的频率表,并使用ASCII码作为索引计算字符串中字符的出现次数。我被困在如何使用存储的ASCII值作为索引并增加该索引上。这是我到目前为止所拥有的Assembly 制作频率表,assembly,x86,masm,irvine32,Assembly,X86,Masm,Irvine32,我应该创建一个包含256个DWORD的频率表,并使用ASCII码作为索引计算字符串中字符的出现次数。我被困在如何使用存储的ASCII值作为索引并增加该索引上。这是我到目前为止所拥有的 TITLE String Find INCLUDE Irvine32.inc Get_freqs PROTO, ptrTarget:PTR BYTE, ptrFreqTable:PTR BYTE .data targetStr BYTE
TITLE String Find
INCLUDE Irvine32.inc
Get_freqs PROTO,
ptrTarget:PTR BYTE,
ptrFreqTable:PTR BYTE
.data
targetStr BYTE "AAEBDCFBBC",0
freqTable DWORD 256 DUP(0)
.code
main PROC
INVOKE Get_freqs, ADDR targetStr, ADDR freqTable
mov ecx,LENGTHOF freqTable
mov edx,LENGTHOF freqTable
L1:
push edx
mov eax,edx
call writeInt
mov al,' '
call writeChar
mov eax,OFFSET freqTable
add eax,ecx
call writeInt
pop edx
dec edx
loop L1
exit
main ENDP
Get_freqs PROC,
ptrTarget:PTR BYTE,
ptrFreqTable:PTR BYTE
INVOKE Str_length,ptrTarget ; EAX = length source
mov ecx,eax
L1:
mov eax,ptrTarget[ecx]
add eax,ptrFreqTable
loop L1
ret
Get_freqs ENDP
END main
这是我遇到麻烦的部分
L1:
mov eax,ptrTarget[ecx]
add ptrFreqTable[eax],1
loop L1
您只需要从字符串中读取字节,然后缩放它们以访问DWORD数组。因此,请替换:
L1:
mov eax,ptrTarget[ecx]
add ptrFreqTable[eax],1
loop L1
比如:
L1:
movzx eax, byte ptr ptrTarget[ecx - 1]
add ptrFreqTable[eax*4 - 4],1
loop L1
-1
和-4
是因为您实际上是从长度(字符串)
循环到1(LOOP
递减CX
,并在CX
等于0时停止循环)。我使用了一些在发布本文时没有教过的指令来修复它
L1:mov eax,0 ; clear upper bits of EAX
lodsb ; AL = [ESI], inc ESI
cmp al,0 ; end of string?
je done ; yes: exit
shl eax,2 ; multiply by 4
inc DWORD PTR[edi+eax] ; add to table entry
jmp L1
done:
我的显示技术也有缺陷,但既然这不是我的问题,我就把它放在这里,这样我回来时就可以拍自己的额头了