Delphi内嵌汇编(2014-01-15)

//函数说明:字节逆序

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修改问题进行了一下验证,分析如下:

Delphi内嵌汇编(2014-01-15)

1、在调用ByteReverse时,编译器已对ECX内容进行保护,ECX可以正常使用。

2、我在使用的过程中一直使用的是MOV CL, 8 并没有对ECX进行清零操作。因此在使用LOOP指令过程中,当ECX的高位不为零时,则LOOP的循环次数将以ECX值为准,造成程序没能按设计执行,将MOV CL, 8指令改为MOV ECX, 8指令即可。

3、对于EBX、EDI等编译器没有进行保护的寄存器在使用时需要在代码中进行PUSH/POP操作。

Delphi内嵌汇编(2014-01-15)

上一篇:HBase MemStoreFlusher


下一篇:第四章· ucos系统及其任务