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;
这是我写的函数的一部分,因为我的函数功能比你的复杂,所以就不全部贴出来了。// 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;
访问http://168.168.18.11:81/etechbase/advsearch.php将您的问题输入查询内容框,选择不同的精确程度,即可以找到你所需要的答案。效果还是可以的。
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;
如果是单字节,可以是:
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;
函数中使用了EDI、ESI,在退出的时候一定要恢复的,不然会引起“不可预测”的问题的。好像还有一个,是EBX吧。
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行,不知中不中你的意?