//函数说明:字节逆序
function ByteReverse(Src: Byte): Byte;
asm
MOV AL, Src //取得形参
MOV AH, $00
MOV DL, 8 //设置循环控制变量
@L:
SHL AH, $01 //当进入循环时将结果逻辑左移一位
CLC //清除CF标志
SHR AL, 1 //将输入参数逻辑右移一位,判断CF标志为0还是为1(循环右移也可以)
JNC @E //CF位为0则直接跳转到NOP指令
ADD AH, $01
@E: NOP
DEC DL //循环控制计数器减一
JNZ @L //不为0则跳转到@L标签再次循环
MOV @Result, AH
end;
注:
使用内嵌汇编时,CX内容疑似可以被外界调用代码修改,所以在使用循环时采用DL作为循环控制变量,而放弃使用LOOP指令。
也有可能是在循环内使用移位操作造成,目前没有想到好的办法验证。
PS.2014-01-15 11:00
对昨晚的CX修改问题进行了一下验证,分析如下:
1、在调用ByteReverse时,编译器已对ECX内容进行保护,ECX可以正常使用。
2、我在使用的过程中一直使用的是MOV CL, 8 并没有对ECX进行清零操作。因此在使用LOOP指令过程中,当ECX的高位不为零时,则LOOP的循环次数将以ECX值为准,造成程序没能按设计执行,将MOV CL, 8指令改为MOV ECX, 8指令即可。
3、对于EBX、EDI等编译器没有进行保护的寄存器在使用时需要在代码中进行PUSH/POP操作。