x86汇编中ret指令作用及notfound标签无需额外ret的疑问
关于x86汇编中
notfound标签无需额外跳转/ret的解释 先把你贴的代码整理出来方便分析:
.386 .model flat .data ;data labels does not have column intArray SWORD 0,0,0,0,1,3,0,-34,-56,7,8 .code main proc mov ebx,OFFSET intArray mov ecx,LENGTHOF intArray ;instruction labels have columns L1: cmp WORD PTR[ebx],0 jnz found add ebx,2 loop L1 jmp notfound found: movsx eax,WORD PTR[ebx] jmp quit notfound: mov eax,999999 quit: ret main endp end main
核心原因:汇编代码是顺序执行的
你疑惑的点本质是没摸透汇编指令的执行逻辑:
- 当遍历完所有数组元素都没找到非零值时,代码会通过
jmp notfound跳转到notfound标签,执行mov eax,999999把“未找到”的标记值写入eax。 - 这条指令执行完后,CPU会自动往下执行下一条指令——也就是
quit标签下的ret,完全不需要额外加跳转或ret指令。
而found标签必须加jmp quit,是因为如果不加,movsx执行完后会继续往下跑notfound的mov eax,999999,直接把刚找到的非零值覆盖掉,结果就错了。
关于eax的角色:不只是累加器,更是标准返回值寄存器
你说eax是累加器没错,但在x86的标准调用约定里(比如你用的flat模型,main作为程序入口),程序的返回值就是通过eax传递的——操作系统会读取eax的值作为程序的退出结果。
所以这段代码不管是找到非零值(写入eax)还是没找到(写入999999到eax),最终都是通过eax返回结果,再执行ret结束程序。
补充:给notfound加jmp quit也能跑,但纯属多余
你硬要在notfound后面加jmp quit,代码也能正常运行,但完全没必要——顺序执行本来就会走到quit的ret,额外加跳转只是多一条冗余指令,没有任何实际作用。
内容的提问来源于stack exchange,提问作者jackyjacky
相关产品推荐
相关产品推荐

