我正在 Linux 上使用
Nasm
(Debian 12
)学习 x86 汇编。
我已经知道什么是堆栈,所以我想当我们用汇编编码时,我们自己实现它。
但我看到了像push和pop这样的指令,它们是用于堆栈操作的。那么是否有一个已经实现并可以使用的堆栈?如果是,那么它是如何使用的以及我们如何使用它。我在 asm 中创建了一个 strlen
函数
section .data
hello db "Hello World!",10,0
section .text
global _start
_start:
mov rax,hello
call strlen
mov rax,1
mov rdi,1
mov rsi,hello
syscall
mov rax,60
mov rdi,0
syscall
strlen:
mov rdx,0
strlen_loop:
cmp byte[rax],0
jz strlen_finished
inc rdx
inc rax
jmp strlen_loop
strlen_finished:
ret
这会计算字符串的长度并打印它。我可以使用
push rax
将 rax
的值放入堆栈中,这样 rax
中已有的值就不会丢失。那么我们只以这种方式使用这个已经实现的堆栈,或者处理器是否也以其他方式使用这个堆栈?这个堆栈和我们自己创建的堆栈有什么区别?
我期望我们自己必须实现堆栈来跟踪函数的局部变量和东西。
操作系统创建一个进程来运行应用程序。 在该进程中,最初有一个线程,在处理器运行该进程中的第一条指令之前,该线程具有工作堆栈和堆栈指针寄存器。 之后,应用程序可以创建更多的线程,操作系统也会为其提供工作堆栈和寄存器。
以及我们将自己创建的堆栈? 我期望我们自己必须实现堆栈来跟踪函数的局部变量和其他东西。
我们自己不创建堆栈,我们只是使用操作系统给定的堆栈来堆栈事物 - 应用程序对事物进行“堆栈”,但它们通常不会创建/准备这些堆栈以进行堆栈。