x86汇编JG指令逻辑疑问:未跳转却执行jumpto段代码求助
问题分析:JG指令逻辑与汇编代码执行流程问题
你的汇编代码逻辑存在关键漏洞,先看你写的代码:
__asm { MOV EAX, x CMP EAX, 9 JG jumpto ADD EAX, 48 MOV x, EAX jumpto: ADD EAX, 55 MOV x, EAX } return x; }``` ### 问题根源 JG指令的作用是**当EAX>9时,直接跳转到`jumpto:`标记的位置**;但如果EAX≤9,它不会跳转,而是按顺序执行`JG`后面的代码——也就是`ADD EAX,48`和`MOV x,EAX`。但问题是,执行完这两行后,程序会**继续往下执行**,直接进入`jumpto:`后面的`ADD EAX,55`和`MOV x,EAX`,相当于不管x是大于9还是小于等于9,最后都会执行加55的操作。 打个比方,你现在的代码逻辑等价于: ```c if (x > 9) { // 直接跳到加55的代码 } else { x += 48; } // 不管if条件满足不满足,都会执行这行 x += 55;
修复方法
在不跳转分支的结尾(也就是MOV x, EAX之后),加一条JMP指令,直接跳转到汇编代码的末尾,跳过jumpto:的代码,这样两个分支就完全分离了:
__asm { MOV EAX, x CMP EAX, 9 JG jumpto ADD EAX, 48 MOV x, EAX JMP end_asm // 新增:跳转到汇编结尾,跳过后续代码 jumpto: ADD EAX, 55 MOV x, EAX end_asm: // 新增:标记汇编代码结束位置 } return x; }``` ### 补充说明 汇编是**顺序执行**的,指令只会按从上到下的顺序跑,除非遇到跳转指令让它跳走。JG只是条件跳转,不满足条件时不会帮你“跳过”后面的分支代码,必须手动用JMP来完成分支的隔离。 内容的提问来源于stack exchange,提问作者pnd__
相关产品推荐
相关产品推荐

