首页
社区
课程
招聘
[求助]win32汇编问题:帮忙指点一下这段代码
发表于: 2008-3-4 16:42 5297

[求助]win32汇编问题:帮忙指点一下这段代码

2008-3-4 16:42
5297
我想从指定的位置(Pa)开始读入缓冲区(_BF)中的一行数据(字符)。
自建一函数,代码如下:

LineInput        proc        _Bf,_Sr:byte,Pa;从内存中Pa开始位置读入一行字符串,返回字符串结束位置
        local        IsExit;退出标志
        local        Num;计数器
        mov        Num,0;计数器初始化
        lea        esi,_Bf;移至开始位置
        add        esi,Pa
        .while        TRUE;进入循环
                add        esi,Num               
                cmp        BYTE ptr [esi],10;比较该字符是否等于10(换行键)
                je        labelExit;如果为换行键,跳转
                cmp        BYTE ptr [esi],13;比较该字符是否等于13(回车键)
                jne        labelPro;不等于回车键,跳转
                mov        IsExit,TRUE;退出标志为真
                cmp        BYTE ptr [esi],0;是否为0(结束符)
                je        Exit;如果为结束符则退出循环
                inc        Num;位置后移一位
                .continue;跳至循环开始位置
        Exit:
                .break;退出循环
        labelPro:
                lea        ax,_Sr
                mov        BYTE ptr [ax+Num],BYTE ptr [esi];将该字符加入字符串
                inc        Num;计数器加1********************这句出错
                .continue;跳至循环开始位置
        labelExit:
                inc        Num;位置后移一位                               
                .break        .if IsExit;如果退出标志为真且该字符等于10则退出
        .endw;
        mov        eax,esi;将位置返回
LineInput        endp

编译时(星号位置)出错。出错代码:

error A2031:must be index or base register

如果我把出错地方的前一句删掉,则能通过编译链接。

请各位大大帮忙看看啊

[课程]Android-CTF解题方法汇总!

收藏
免费 0
支持
分享
最新回复 (4)
雪    币: 2384
活跃值: (766)
能力值: (RANK:410 )
在线值:
发帖
回帖
粉丝
2
; 大概修改了一下。
LineInput  proc  _Bf,_Sr:byte,Pa;从内存中Pa开始位置读入一行字符串,返回字符串结束位置 ; 看你下面的操作,这一句的_Sr变量也有问题,这个变量应该是一个Buffer指针才对吧。所以应该改成下面那样。
LineInput  proc  _Bf,_OutStrBuff,Pa
  local  IsExit;退出标志
  local  Num;计数器
  mov  Num,0;计数器初始化
push esi ; 你的代码改变了esi寄存器,一般函数规则是除了eax/edx/ecx之外其它寄存器在函数返回时必须恢复原始值。所以这里添加一句push esi的语句
;  lea  esi,_Bf;移至开始位置 ; 这一句有问题,改成下面那句
mov esi,_Bf
  add  esi,Pa
  .while  TRUE;进入循环
    add  esi,Num   
    cmp  BYTE ptr [esi],10;比较该字符是否等于10(换行键)
    je  labelExit;如果为换行键,跳转
    cmp  BYTE ptr [esi],13;比较该字符是否等于13(回车键)
    jne  labelPro;不等于回车键,跳转
    mov  IsExit,TRUE;退出标志为真
    cmp  BYTE ptr [esi],0;是否为0(结束符)
    je  Exit;如果为结束符则退出循环
    inc  Num;位置后移一位
    .continue;跳至循环开始位置
  Exit:
    .break;退出循环
  labelPro:
;    lea  ax,_Sr ; 根据上面的定义,这一句改成下面那样。
mov eax,_OutStrBuff
    mov  BYTE ptr [ax+Num],BYTE ptr [esi];将该字符加入字符串 ; 将这一句改成下面几句
    mov edx,Num
    mov cl,byte ptr [esi]
    mov byte ptr [eax+edx],cl

    inc  Num;计数器加1********************这句出错
    .continue;跳至循环开始位置
  labelExit:
    inc  Num;位置后移一位        
    .break  .if IsExit;如果退出标志为真且该字符等于10则退出
  .endw;
  mov  eax,esi;将位置返回
  pop esi ; 恢复esi的值
LineInput  endp
2008-3-4 17:07
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
晕..刚在AOGO网站上看过...
2008-3-4 18:44
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
感谢小虾版主的无私教诲,成功了
2008-3-5 10:09
0
雪    币: 350
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
同感谢小虾版主的详细指点.
2008-3-5 12:02
0
游客
登录 | 注册 方可回帖
返回
//