组装练习

Assembly Exercise

我在汇编中有这个 RLE 练习来计算数组的元素,但我遇到了一个我无法理解的奇怪问题。在标签 RegisterOccurrence 中,我第二次递增 BL 并将其与 255 进行比较,因为这是 unsigned char 的最大值,以防数组中有更多元素。现在的问题是,在这种情况下,当 CMP BL,255 完成时,BL 将为 2,而 2 低于 255,程序仍会跳转到 AdjustValue


    __asm
    {
        XOR EAX, EAX
        XOR EBX, EBX
        XOR ECX, ECX
        XOR EDX, EDX
        XOR EDI, EDI
        XOR ESI, ESI

        MOV EAX, Len                     

//---------------------------------------------------------------------------------------------------------------------


Loop:
           CMP ESI,EAX
           JE EndProgram
           MOV DL,[Buffer+ESI]
           MOV CL,[Buffer+ESI+1]
           CMP DL,CL
           JE Occurrence
           JNE SingleNumber
           INC ESI
           JMP Loop
//----------------------------------------------------------------------------------------------------------------------



SingleNumber:
           MOV BufComp[EDI],1
           MOV BufComp[EDI+1],DL
           INC ESI
           ADD EDI,2
           JMP Loop

//----------------------------------------------------------------------------------------------------------------

Occurrence:
           INC BL
           INC ESI
           MOV DL, [Buffer + ESI]
           MOV CL, [Buffer + ESI + 1]
           CMP DL,CL
           JNE RegisterOccurrence
           JMP Loop

//---------------------------------------------------------------------------------------------------------------

RegisterOccurrence:
           INC BL
           CMP BL,255
           JG AdjustValue 
           MOV BufComp[EDI],BL
           MOV BufComp[EDI+1],DL
           INC ESI
           ADD EDI,2
           XOR EBX,EBX
           JMP Loop

//-------------------------------------------------------------------------------------------------------------------


AdjustValue:
           SUB BL,255
           MOV BufComp[EDI],255
           MOV BufComp[EDI+1],DL
           ADD EDI,2
           MOV BufComp[EDI],BL
           MOV BufComp[EDI+1],DL
           INC ESI
           ADD EDI,2
           XOR EBX,EBX
           JMP Loop

//----------------------------------------------------------------------------------------------------------------------


EndProgram:
           
           MOV BufComp[EDI],0d
    }

//PRINT VALUES PART

指令JG用于比较有符号整数。一个 8 位值 255 表示 -1 的二进制补码并且跳转是因为 2 大于 -1.

你应该使用 JA 来比较无符号整数并在大写时跳转。

参考:Intel x86 JUMP quick reference