首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在程序集x86 IRVINE32中查找字符串长度

在程序集x86 IRVINE32中查找字符串长度
EN

Stack Overflow用户
提问于 2016-10-20 21:17:08
回答 1查看 4.6K关注 0票数 0

我对汇编编程还不熟悉,我正试图找出这个程序的最后一个谜题。当我显示一个字符串("Hello")时,它显示为0而不是5。为什么会发生这种情况,我需要做什么来改变它呢?

代码语言:javascript
复制
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
EN

回答 1

Stack Overflow用户

发布于 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作为参数,但是您可以为它提供一个长度!这就是撞车的原因。

代码语言:javascript
复制
 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过程是这样的:

代码语言:javascript
复制
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

以及如何称呼它:

代码语言:javascript
复制
    push   OFFSET prompt
    call   STRQRY
    call   writedec         <<< Length given by ReadString
    push   OFFSET response
    call   STRLEN
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/40164720

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档