我正在尝试计算字符串中字符的出现次数。我的代码如下:
data segment 'DSEG'
text db "This is a sentence.",0 ; string
textSize dw $ - text - 1 ; size of string, - 1 to account for null-termination character
freqTable dd 256 DUP(0)
ends 'DSEG'
code segment 'CSEG'
start:
mov ax, data ; set segment registers
mov ds, ax
mov es, ax
;---------------------------------------
sub cx, cx
mov cx, textSize ; number of times to loop
L1:
mov ax, [OFFSET text + cx - 1] ; loop from back using cx, put character in ax
inc [OFFSET freqTable + 4*ax] ; increment table's index at the ascii value of character
LOOP L1
;---------------------------------------
mov ax, 4c00h ; return to OS
int 21h
ends 'CSEG'
end start ; set entry point
我创建了一个DWORDS
数组,其中每个索引代表一个字符,然后循环遍历字符串,并尝试在每个字符的ascii值处递增数组。
然而,当我尝试在循环中递增时,我得到了一个wrong parameters
错误。我不确定是什么导致了这个错误。我猜我不能只是以我尝试的方式递增。我如何正确地创建频率表?我是否遗漏了一些小东西?
2条答案
按热度按时间llmtgqce1#
X86不允许像你那样通过使用AX和CX寄存器来进行内存寻址。但是你可以使用EAX和ECX来实现这个目的。
到下一个代码片段为止,位EAX[8,31]和ECX[16,31]将保持为零。
yyhrrdl82#
为了帮助您了解如何计数字符我创建了下一个小程序与EMU8086(与您的汇编兼容):程序要求用户输入文件名,打开文件,读取所有字符并对它们计数,然后关闭文件。
下图显示了其工作原理:有一个频率数组(“freq_array”),有256个位置。每个位置是对应字符的计数器,例如,位置65是'A'的计数器(chr(65))。
每次从文件中读取一个字符时,字符本身将被用作到达其计数器的偏移量。例如,如果从文件中读取字符48('0 '),则将数字48添加到数组偏移量(偏移量+ 48),并且该位置将递增。当文件结束时,其所有字符都已被计数。
现在代码:
希望这对你有帮助。
这是16位,因为数组是DW。要使其与32位(数组DD)兼容,请更改下面的行: