我在程序集中有这个RLE练习来计算数组的元素,我遇到了一个我无法理解的奇怪的问题。在label RegisterOccurrence中,我第二次增加BL并将其与255进行比较,因为这是一个无符号字符的最大值,以防数组中有更多的元素。现在的问题是,在本例中,当CMP BL完成时,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
发布于 2021-05-21 19:34:49
指令JG
用于符号整数的比较。8位值255
表示-1
在两个补码中,跳转是因为2
大于-1
。
您应该使用JA
来比较无符号整数并在更大的情况下跳转。
参考资料:英特尔x86跳转快速参考
https://stackoverflow.com/questions/67642946
复制相似问题