gpt4 book ai didi

assembly - 子程序如何在不被调用的情况下执行?

转载 作者:行者123 更新时间:2023-12-03 08:59:28 24 4
gpt4 key购买 nike

我对汇编(x86_64)非常陌生,并且遇到了一个教程,该教程提供了一个简单的程序来打印具有未定义长度的字符串。程序如下:

section .data
text db "Hello, World!",10,0

section .text
global _start

_start:
mov rax, text
call _print

mov rax, 60
mov rdi, 0
syscall

_print:
push rax
mov rbx, 0

_printLoop:
inc rax
inc rbx
mov cl, [rax]
cmp cl, 0
jne _printLoop

mov rax, 1
mov rdi, 1
pop rsi
mov rdx, rbx
syscall

ret

我理解了它的逻辑,除了一件事,_printLoop 子例程在根本没有被调用的情况下是如何被执行的?是不是因为 _print 没有 ret 语句而失败?标签不就是封装吗?预先感谢您的任何解释!

最佳答案

正如@ped7g所指出的,执行例程的原因是因为它从打印例程中失败了。

在汇编中,call指令将返回地址保存到内存(在堆栈上)并且弹出它(即返回到所述点)直到它遇到ret 语句。执行始终继续到下一条指令,除非存在某种跳转(call/ret/jmp),无论标签如何。

至于标签,它们只是某些内存位置的“昵称”,以便程序员更轻松地编写汇编代码。您无需记住十六进制地址并跳转到它,只需使用标签来引用它即可。这是它们唯一的功能;这种连接(十六进制地址和标签之间)是由汇编器(以及当前文件外部标签的链接器,或者绝对引用而不是相对引用)完成的。

关于assembly - 子程序如何在不被调用的情况下执行?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52130264/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com