首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >装配练习

装配练习
EN

Stack Overflow用户
提问于 2021-05-21 19:30:22
回答 1查看 92关注 0票数 0

我在程序集中有这个RLE练习来计算数组的元素,我遇到了一个我无法理解的奇怪的问题。在label RegisterOccurrence中,我第二次增加BL并将其与255进行比较,因为这是一个无符号字符的最大值,以防数组中有更多的元素。现在的问题是,在本例中,当CMP BL完成时,BL将是2,2低于255,程序仍跳转到AdjustValue。

代码语言:javascript
运行
复制
    __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
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-05-21 19:34:49

指令JG用于符号整数的比较。8位值255表示-1在两个补码中,跳转是因为2大于-1

您应该使用JA来比较无符号整数并在更大的情况下跳转。

参考资料:英特尔x86跳转快速参考

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/67642946

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档