MASM 循环计数器只显示 '+0' (irvine32)
MASM loop counter only displays '+0' (irvine32)
我有一个即将完成的脚本。我正在努力完成计数器这个词。
在这种情况下,我正在计算 space 的每个实例,并假设这意味着它是一个单词的结尾。
每次在字符串中找到“ ”时,'totalWords' 变量初始化为 0 并递增。
但是,无论何时测试,输出始终为“+0”。我知道脚本的其余部分可以正常工作,因为它成功地转换了字母的大小写。
增加变量并显示它的最佳做法是什么?
INCLUDE Irvine32.inc
.data
source BYTE 40 DUP (0)
byteCount DWORD ?
target BYTE SIZEOF source DUP('#')
sentencePrompt BYTE "Please enter a sentence: ",0
wordCountPrompt BYTE "The number of words in the input string is: ",0
outputStringPrompt BYTE "The output string is: ",0
totalWords DWORD 0 ; SET TOTALWORDS VARIABLE TO 0 INITIALLY
one DWORD 1
space BYTE " ",0
.code
main PROC
mov edx, OFFSET sentencePrompt
call Crlf
call WriteString
mov edx, OFFSET source
MOV ecx, SIZEOF source
call ReadString
call Crlf
call Crlf
call TRANSFORM_STRING
call Crlf
exit
main ENDP
TRANSFORM_STRING PROC
mov esi,0
mov edi,0
mov ecx, SIZEOF source
transformStringLoop:
mov al, source[esi]
.IF(al == space)
inc totalWords ; INCREMENT TOTALWORDS DATA
mov target[edi], al
inc esi
inc edi
.ELSE
.IF(al >= 64) && (al <=90)
add al,32
mov target[edi], al
inc esi
inc edi
.ELSEIF (al >= 97) && (al <=122)
sub al,32
mov target[edi], al
inc esi
inc edi
.ELSE
mov target[edi], al
inc esi
inc edi
.ENDIF
.ENDIF
loop transformStringLoop
mov edx, OFFSET wordCountPrompt
call WriteString
mov edx, OFFSET totalWords ; DISPLAY TOTALWORDS
call WriteInt
call Crlf
mov edx, OFFSET outputStringPrompt
call WriteString
mov edx, OFFSET target
call WriteString
ret
TRANSFORM_STRING ENDP
END main
这部分不正确:
mov edx, OFFSET totalWords ; DISPLAY TOTALWORDS
call WriteInt
WriteInt
不期望 edx
中的偏移量;它需要 eax
中的实际整数值。所以代码应该是:
mov eax, totalWords ; DISPLAY TOTALWORDS
call WriteInt
此外,您的 space 变量毫无意义。你可以只写
.IF(al == ' ')
而且你计算字数的方法听起来有点不对劲。一个字符串如 "foo bar"
只包含 1 个 space,而是两个单词。请注意,您也不能真正使用 number_of_spaces+1
,因为这会给 " "
、"foo bar"
和 "foo "
.
等字符串带来错误的结果
你可能会得到更好的结果,比如:
if (al != ' ' && (esi == 0 || source[esi-1] == ' ')) totalWords++;
这只是一些表达想法的伪代码。我将把它转化为 x86 程序集由您来决定。
我有一个即将完成的脚本。我正在努力完成计数器这个词。 在这种情况下,我正在计算 space 的每个实例,并假设这意味着它是一个单词的结尾。
每次在字符串中找到“ ”时,'totalWords' 变量初始化为 0 并递增。
但是,无论何时测试,输出始终为“+0”。我知道脚本的其余部分可以正常工作,因为它成功地转换了字母的大小写。
增加变量并显示它的最佳做法是什么?
INCLUDE Irvine32.inc
.data
source BYTE 40 DUP (0)
byteCount DWORD ?
target BYTE SIZEOF source DUP('#')
sentencePrompt BYTE "Please enter a sentence: ",0
wordCountPrompt BYTE "The number of words in the input string is: ",0
outputStringPrompt BYTE "The output string is: ",0
totalWords DWORD 0 ; SET TOTALWORDS VARIABLE TO 0 INITIALLY
one DWORD 1
space BYTE " ",0
.code
main PROC
mov edx, OFFSET sentencePrompt
call Crlf
call WriteString
mov edx, OFFSET source
MOV ecx, SIZEOF source
call ReadString
call Crlf
call Crlf
call TRANSFORM_STRING
call Crlf
exit
main ENDP
TRANSFORM_STRING PROC
mov esi,0
mov edi,0
mov ecx, SIZEOF source
transformStringLoop:
mov al, source[esi]
.IF(al == space)
inc totalWords ; INCREMENT TOTALWORDS DATA
mov target[edi], al
inc esi
inc edi
.ELSE
.IF(al >= 64) && (al <=90)
add al,32
mov target[edi], al
inc esi
inc edi
.ELSEIF (al >= 97) && (al <=122)
sub al,32
mov target[edi], al
inc esi
inc edi
.ELSE
mov target[edi], al
inc esi
inc edi
.ENDIF
.ENDIF
loop transformStringLoop
mov edx, OFFSET wordCountPrompt
call WriteString
mov edx, OFFSET totalWords ; DISPLAY TOTALWORDS
call WriteInt
call Crlf
mov edx, OFFSET outputStringPrompt
call WriteString
mov edx, OFFSET target
call WriteString
ret
TRANSFORM_STRING ENDP
END main
这部分不正确:
mov edx, OFFSET totalWords ; DISPLAY TOTALWORDS
call WriteInt
WriteInt
不期望 edx
中的偏移量;它需要 eax
中的实际整数值。所以代码应该是:
mov eax, totalWords ; DISPLAY TOTALWORDS
call WriteInt
此外,您的 space 变量毫无意义。你可以只写
.IF(al == ' ')
而且你计算字数的方法听起来有点不对劲。一个字符串如 "foo bar"
只包含 1 个 space,而是两个单词。请注意,您也不能真正使用 number_of_spaces+1
,因为这会给 " "
、"foo bar"
和 "foo "
.
你可能会得到更好的结果,比如:
if (al != ' ' && (esi == 0 || source[esi-1] == ' ')) totalWords++;
这只是一些表达想法的伪代码。我将把它转化为 x86 程序集由您来决定。