组装练习
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
来比较无符号整数并在大写时跳转。
我在汇编中有这个 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
来比较无符号整数并在大写时跳转。