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

问题描述 投票:1回答:1

我对汇编(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声明?不是标签封装?在此先感谢任何解释!

assembly nasm subroutine
1个回答
3
投票

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

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

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

© www.soinside.com 2019 - 2024. All rights reserved.