【发布时间】:2018-09-01 16:47:03
【问题描述】:
我对汇编 (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 声明而失败?标签不是封装吗?提前感谢您的任何解释!
【问题讨论】:
-
是的,它失败了,CPU 不会停止并在每一条指令之后继续执行下一条和下一条指令。而标签只是内存中的书签(源代码中特定位置的内存地址),它们没有封装或任何东西,它们对最终的机器代码完全不可见,只有在汇编过程中对汇编程序可见。
标签: assembly nasm subroutine