我要写一个抄表机的程序,其中要用到PASCAL语言的HT扩展函数库,其中有不少汇编代码
其中有一段是这样的
  function CharStr(c: char; n: integer): string; assembler;
    asm
      les     di, @result     //这行出错 提示:Operand size mismatch
      mov     ax, n            //这行出错 提示:Operand size mismatch
      call    AdjustLen
      cld
      stosb
      mov     cl, al
      xor     ch, ch
      mov     al, c
      rep stosb
    end;可是在编译时候老是出错,是不是我需要在程序开始USES什么文件的。
请大家帮忙看看,谢谢

解决方案 »

  1.   

    是不是寄存器用错了,用EDI,和EAX试试?
      

  2.   

    好像没用,,LES 和 EDI不能连用的吧?
      

  3.   

    mov     ax, n
    这行应该就是寄存器的问题,用EAX就可以。
      

  4.   

    当然,EAX才是32Bit的!
    EDI也是32Bit!没E的都是16Bit,E的是32http://lysoft.7u7.net
      

  5.   

    asm
          les     di, @result     //这行出错 提示:Operand size mismatch
          mov     ax, n            //这行出错 提示:Operand size mismatch
    ---------------------------------------------------------------
    改为
    asm
          push
          les     Edi, @result     //这行出错 提示:Operand size mismatch
          mov     Eax, n            //这行出错 提示:Operand size mismatch
          ...
          pop     edi
    试试吧  
      

  6.   

    XuDunYu(西门吹雪):不行,也出错 function CharStr(c: char; n: integer): string; assembler;
        asm
          push                 //这行出错 提示Invalid combination of opcode and operands 
          les     edi, @result  //这行出错 提示Invalid combination of opcode and operands 
          mov     eax, n
          call    AdjustLen
          cld
          stosb
          mov     cl, al
          xor     ch, ch
          mov     al, c
          rep stosb
          pop edi
        end;
      

  7.   

    笨蛋啊你,
    不管你用什么寄存器,用之前要PUSH他们,用之后也要POP他们。但不管你不不用EBX寄存器,都要PUSH EBX,汇编程序结束前也要POP EBX。这是一定的
      

  8.   

    人家都说了是Pascal下用的,先搞明白那是16位环境?32位环境下是4G平滑内存啊,指针本身就是4字节,哪来les di, @result???第二个错误就更明显了,Delphi里的Integer是4字节而不是16环境下的2字节,而ax是16位寄存器。另外Delphi里的string默认和TP里是两回事。另外Delphi里,按照默认调用约定,AL寄存器里的值就是a,而EDX寄存器里是n,因为默认就是直接用寄存器传递参数。这个东西的用处应该就是用n个字符填充字符串,就像FillChar,直接用FillChar好了。
      

  9.   

    >>笨蛋啊你,
    >>不管你用什么寄存器,用之前要PUSH他们,用之后也要POP他们。
    >>但不管你不不用EBX寄存器,都要PUSH EBX,汇编程序结束前也要POP EBX。这是一定的先别这么激动骂人家笨蛋啥,似懂非懂误导别人会害死人的,以前教我们的那个汇编老师就这样,晕死~~~乱用PUSH/POP是会严重降低程序性能的
      

  10.   

    asm
          push    edi       //sorry 少了edi        
          les     edi, @result 
          mov     eax, n
          call    AdjustLen
          cld
          stosb
          mov     cl, al
          xor     ch, ch
          mov     al, c
          rep stosb
          pop edi
        end;