0

我正在阅读文档来编写 NSIS 安装程序。我跌倒在这些线上

NSIS 用于编写脚本的指令是 PHP 和程序集之间的一种交叉。没有真正的高级语言结构,但指令本身(大部分)是高级的,并且您拥有方便的字符串功能(即您不必担心连接字符串等)。您基本上有 25 个寄存器(20 个通用寄存器,5 个专用寄存器)和一个堆栈。

一种语言有 25 个寄存器和一个堆栈是什么意思?这些是数据结构。IMO 这些与内存管理有关,而不是语言语法或结构。这与语言结构/语法有什么关系?

谢谢

4

2 回答 2

2

该文档是指寄存器

  • $0..$9
  • $R0..$R9
  • $CMDLINE
  • $INSTDIR
  • $OUTDIR
  • $EXEDIR
  • $LANGUAGE

您也可以将它们称为变量,它们只是预先存在的内置全局变量。前 20 个是一般使用变量,最后一个在 nsis 脚本中有专门的用法。

关于堆栈,您实际上可以在安装程序(或卸载程序)执行期间pushing 和poping 任意值,但它在某种程度上是高级堆栈,因为您不仅可以推送数字寄存器,还可以推送字符串。您可以通过交换值来玩堆栈,就像使用 Forth 或 HP 计算器的 RPL 语言一样。

于 2012-11-16T09:29:36.407 回答
2

寄存器只是始终存在的变量(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 上有堆栈的迷你指南...

于 2012-11-16T09:29:49.860 回答