我对汇编编程还不熟悉,我正试图找出这个程序的最后一个谜题。当我显示一个字符串("Hello")时,它显示为0而不是5。为什么会发生这种情况,我需要做什么来改变它呢?
TITLE
INCLUDE Irvine32.inc
.data
prompt BYTE "Enter String: ", 0
response BYTE 50 DUP(0)
message BYTE " Message entered. ",0
.code
STRQRY PROC
push ebp
mov ebp, esp
push edx
push ecx
mov edx, [ebp+8]
call writestring
mov ecx, SIZEOF response
mov edx, OFFSET response
call readstring
pop ecx
pop edx
pop ebp
ret 4
STRQRY ENDP
STRLEN PROC
push ebp
mov ebp, esp
push ebx
push ecx
mov edx,[ebp+8]
call writedec
mov eax, 0
counter:
mov cl,[edx+eax]
cmp cl, 0
JE done
inc eax
jmp counter
done:
pop ecx
pop ebx
pop ebp
ret 4
STRLEN ENDP
main PROC
push OFFSET prompt
call STRQRY
push eax
call STRLEN
mov edx,OFFSET message
call WriteString
mov edx, OFFSET response
call WriteString
exit
main ENDP
END main发布于 2016-10-21 16:53:18
您说您想要找出输入字符串的长度,但这正是IRVINE32 readstring函数在EAX寄存器中返回的内容!
mov ecx,SIZEOF响应mov edx,偏移响应调用readstring
在这个块中,ECX应该比您提供的输入缓冲区的大小少1。这允许添加一个空终止符。您将响应定义为50个字节,这样mov ecx, 49就可以了。
调用STRQRY *这里EAX有输入的长度!*推送eax调用STRLEN
当STRLEN过程运行时,它希望是一个address作为参数,但是您可以为它提供一个长度!这就是撞车的原因。
mov edx, [bp+8] <<< This needs to be the ADDRESS to start at!
mov eax, 0
counter:
mov cl,[edx+eax]
...mov,ebp+8 call writedec mov eax,0计数器: mov,edx+eax cmp cl,0 JE done公司eax jmp计数器完成:
在这段代码中,您在错误的位置使用writedec!在这一点上,EAX没有计算出的长度。将call writedec移到done标签下面。
在STRLEN过程中,您需要在push/pop中保存/恢复EDX寄存器。
总之,STRLEN过程是这样的:
STRLEN PROC
push ebp
mov ebp, esp
push edx
push ecx
mov edx, [bp+8]
mov eax, 0
counter:
mov cl, [edx+eax]
cmp cl, 0
JE done
inc eax
jmp counter
done:
call writedec <<< Length calculated by you
pop ecx
pop edx
pop ebp
ret 4
STRLEN ENDP以及如何称呼它:
push OFFSET prompt
call STRQRY
call writedec <<< Length given by ReadString
push OFFSET response
call STRLENhttps://stackoverflow.com/questions/40164720
复制相似问题