function CharToBit(C: Char): Byte;
这是我写的函数的一部分,因为我的函数功能比你的复杂,所以就不全部贴出来了。// 16进制到字符,参数C只有低4位有效,高4位被忽略。
function BitToChar(C: BYTE): Char;
asm
  AND AL, $0F
  OR  AL, $30
  CMP AL, $3A
  JB @@Exit
  ADD AL, CIAdj;
@@Exit:
end;//字符到16进制
function CharToBit(C: Char): Byte;
asm
  SUB AL, $30
  CMP AL, $11
  JB  @@Exit
  SUB AL, CIAdj
@@Exit:
end;

解决方案 »

  1.   

    建议您访问www.etechbase.net/tech,里面有很多资料,也许可以解决您的问题。
    访问http://168.168.18.11:81/etechbase/advsearch.php将您的问题输入查询内容框,选择不同的精确程度,即可以找到你所需要的答案。效果还是可以的。
      

  2.   

    写了个例子:function BinToHex(Sour: string): string;const
      CIAdj = Pred(BYTE('A') - BYTE('9'));var
      iCount, iPos: Integer;
    begin
      iCount := Length(Sour);
      SetLength(Result, iCount shl 1);
      asm
        PUSH ESI;
        PUSH EDI;
         MOV ESI, Sour;
        MOV EDI, Result;
        MOV EDI, [EDI];
        MOV ECX, iCount;
      @@Loop:
        LODSB
        MOV AH, AL
        SHL AL, 4
        AND AX, $0F0F
        OR  AX, $3030
        CMP AL, $3A
        JB @@ExitL
        ADD AL, CIAdj;
      @@ExitL:
        CMP AH, $3A
        JB @@ExitH
        ADD AH, CIAdj;
      @@ExitH:
        STOSW
        LOOP @@Loop
        POP EDI;
        POP ESI;
      end;
    end;
      

  3.   

    本来GoodHope兄的已经不错,可以有点小问题:SHL AL,4应是SHR AL, 4才对。
    如果是单字节,可以是:
    function ByteToHex(S: Byte): String;
    begin
      SetLength(Result, 2);
      asm
        MOV         EDI, [Result]
        MOV         EDI, [EDI]
        MOV         AL, S
        MOV         AH, AL          // Save to AH
        SHR         AL, 4           // Output High 4 Bits
        ADD         AL, '0'
        CMP         AL, '9'
        JBE         @@OutCharLo
        ADD         AL, 'A'-'9'-1
    @@OutCharLo:
        AND         AH, $f
        ADD         AH, '0'
        CMP         AH, '9'
        JBE         @@OutChar
        ADD         AH, 'A'-'9'-1
    @@OutChar:
        STOSW
      end;
    end;
      

  4.   

    呵呵,差点误人子弟:)2:ether
    函数中使用了EDI、ESI,在退出的时候一定要恢复的,不然会引起“不可预测”的问题的。好像还有一个,是EBX吧。
      

  5.   

    还是有问题,SetLength执行的指令太多了
      

  6.   

    难道不能想delphi那样用纯Asm而不用函数吗?
      

  7.   

    难道不能想delphi那样用纯Asm而不用函数吗?如果查看汇编的话,会发现以上各位的代码80%的代码都在执行SetLength上,单纯从效率上看还不如我自己写的不用汇编的程序呢
      

  8.   

    难道不能想delphi那样用纯Asm而不用函数吗?如果查看汇编的话,会发现以上各位的代码80+%的代码都在执行SetLength上,单纯从效率上看还不如我自己写的不用汇编的程序呢
      

  9.   

    真不知道你的意图。看起来大多数麻烦都是用了string类型的缘故。何妨改用PChar?array3=array[0..2] of char;
    procedure TForm1.SpinEdit1Change(Sender: TObject);
    var
      buf: array3;
    begin
      buf[2] := #0;//留一个结尾的0,返回后可将buf作为PChar类型访问
      ByteToText(buf, SpinEdit1.Value); 
    end;procedure ByteToText(var buf: array3; b:shortint);
    const
      dict: array[0..15] of char ='0123456789ABCDEF';
    begin
      buf[0] := dict[b shr 4];
      buf[1] := dict[b and $0f];
    end;这个过程的汇编码只有9行,不知中不中你的意?
      

  10.   

    那么我显示出来怎么办?最后还是要转化为string呀?