如果 nasm 代码遇到 _start 的结尾,它会自动移动到下一个标签吗? [复制]

Posted

技术标签:

【中文标题】如果 nasm 代码遇到 _start 的结尾,它会自动移动到下一个标签吗? [复制]【英文标题】:Does nasm code automatically move to the next label if it meets the end of _start? [duplicate] 【发布时间】:2019-12-17 12:02:23 【问题描述】:

我有代码:

global _start

section .text
_start:
        mov ebx,1
        mov ecx,4
label:
        add ebx,ebx
        dec ecx
        cmp ecx,0
        jg label
        mov eax,1
        int 0x80

它返回 16,表示 'label' 中的代码已运行。但是,我没有告诉它跳转到标签。 _start结束后代码会自动跳转到下一个标签吗?

【问题讨论】:

_start 本身不是一个函数(它没有被调用,因此堆栈上没有返回地址),但重复项说明标签不会影响生成的机器代码;执行只是通过他们。 asm 标签类似于 goto 的 C 标签,而不是函数范围。 【参考方案1】:

缺少返回或跳转指令或进程终止服务调用,是的,执行确实“落入”到您的 _start 代码结束后内存中的下一个内容。在这种情况下,这就是您标签上名为 label 的代码。

如果在代码结束后有数据,或未映射的页面,处理器会尝试执行该操作。这很可能会导致无限循环或崩溃或挂起。

【讨论】:

以上是关于如果 nasm 代码遇到 _start 的结尾,它会自动移动到下一个标签吗? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

我可以在 MacOS 的 _start 处的代码中执行 `ret` 指令吗? Linux?

如何强制 NASM 将 int3 编码为 0xCC

NASM x86_64在32位模式下组装:为什么该指令产生RIP相对寻址代码?

使用GDB for NASM程序集中断本地标签

Linux内核使用哪个程序集?真的是NASM吗?

NASM呼叫标签未被调用