大会 'call' 与 'jmp'
Assembly 'call' vs 'jmp'
有人告诉我尝试使用'jmp 而不是 'call',但是 'jmp' 不喜欢我.. 当我跳的时候它不 return(所以它永远不会退出而不是快乐的日子),但调用 returns 并正常退出。
我很高兴使用 'call' 但实际上我有理由尝试克服 'jmp' 吗?
这个简单的代码只是显示当我 jmp
它永远不会 return 并且退出时。
_start:
jmp _Print
jmp _Exit
ret
_Exit:
; normal exit
ret
_Print
; print something
ret
还有 .. 我 运行 这一切都在 Linux 终端,如果有任何改变的话。
嗯,首先,jmp
简单地 'jumps' 你给它的标签(这是一个内存地址,因为程序指令存储在内存中)而 call
将return(在call
指令下方)的位置存储在堆栈中,jmp
到标签,然后在ret
指令处,jmp
回到存储的位置(如上所述,在调用指令下方)。如您所见,那里有点不同。恕我直言,我认为简单地 call
函数很好,因为这是 c++ 编译器对函数所做的,但是如果你必须 jmp
,那么好吧,只要确保 push
return 位置或创建另一个标签到 return 以完成执行某些代码。
这是完成后跳转到其他标签的示例:
_start:
jmp _Print;
_start_label:
jmp _Exit;
_Exit:
; exit stuff goes here
ret;
_Print:
;print stuff goes here
jmp _start_label;
或者您可以直接调用 :)
有人告诉我尝试使用'jmp 而不是 'call',但是 'jmp' 不喜欢我.. 当我跳的时候它不 return(所以它永远不会退出而不是快乐的日子),但调用 returns 并正常退出。
我很高兴使用 'call' 但实际上我有理由尝试克服 'jmp' 吗?
这个简单的代码只是显示当我 jmp
它永远不会 return 并且退出时。
_start:
jmp _Print
jmp _Exit
ret
_Exit:
; normal exit
ret
_Print
; print something
ret
还有 .. 我 运行 这一切都在 Linux 终端,如果有任何改变的话。
嗯,首先,jmp
简单地 'jumps' 你给它的标签(这是一个内存地址,因为程序指令存储在内存中)而 call
将return(在call
指令下方)的位置存储在堆栈中,jmp
到标签,然后在ret
指令处,jmp
回到存储的位置(如上所述,在调用指令下方)。如您所见,那里有点不同。恕我直言,我认为简单地 call
函数很好,因为这是 c++ 编译器对函数所做的,但是如果你必须 jmp
,那么好吧,只要确保 push
return 位置或创建另一个标签到 return 以完成执行某些代码。
这是完成后跳转到其他标签的示例:
_start:
jmp _Print;
_start_label:
jmp _Exit;
_Exit:
; exit stuff goes here
ret;
_Print:
;print stuff goes here
jmp _start_label;
或者您可以直接调用 :)