我正在阅读文档来编写 NSIS 安装程序。我跌倒在这些线上:
NSIS 用于编写脚本的指令是 PHP 和程序集之间的一种交叉。没有真正的高级语言结构,但指令本身(大部分)是高级的,并且您拥有方便的字符串功能(即您不必担心连接字符串等)。您基本上有 25 个寄存器(20 个通用寄存器,5 个专用寄存器)和一个堆栈。
一种语言有 25 个寄存器和一个堆栈是什么意思?这些是数据结构。IMO 这些与内存管理有关,而不是语言语法或结构。这与语言结构/语法有什么关系?
谢谢
我正在阅读文档来编写 NSIS 安装程序。我跌倒在这些线上:
NSIS 用于编写脚本的指令是 PHP 和程序集之间的一种交叉。没有真正的高级语言结构,但指令本身(大部分)是高级的,并且您拥有方便的字符串功能(即您不必担心连接字符串等)。您基本上有 25 个寄存器(20 个通用寄存器,5 个专用寄存器)和一个堆栈。
一种语言有 25 个寄存器和一个堆栈是什么意思?这些是数据结构。IMO 这些与内存管理有关,而不是语言语法或结构。这与语言结构/语法有什么关系?
谢谢
该文档是指寄存器
$0
..$9
$R0
..$R9
$CMDLINE
$INSTDIR
$OUTDIR
$EXEDIR
$LANGUAGE
您也可以将它们称为变量,它们只是预先存在的内置全局变量。前 20 个是一般使用变量,最后一个在 nsis 脚本中有专门的用法。
关于堆栈,您实际上可以在安装程序(或卸载程序)执行期间push
ing 和pop
ing 任意值,但它在某种程度上是高级堆栈,因为您不仅可以推送数字寄存器,还可以推送字符串。您可以通过交换值来玩堆栈,就像使用 Forth 或 HP 计算器的 RPL 语言一样。
寄存器只是始终存在的变量(var
稍后添加了创建更多变量的能力。)
StrCpy $0 $windir 1
MessageBox mb_ok "The first character is $0"
在内部,NSIS 解释器的工作方式有点像 CPU,有一个指令指针,您可以进行相对跳转等。没有语法糖来隐藏您将参数传递给函数的方式,这就是您必须修改 NSIS 堆栈的原因直接地:
Function DoMagic
pop $0 ; $0 now contains the value that was on top of the stack
; Do something with $0
FunctionEnd
...
push 0xf00ba5
call DoMagic
push "Hello world"
call DoMagic
wiki 上有堆栈的迷你指南...