NSIS指令 - 一些词典问题

时间:2012-11-16 09:02:44

标签: programming-languages installer stack nsis cpu-registers

我正在阅读doc以编写NSIS安装程序。我匆匆忙忙地these lines

  

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

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

由于

2 个答案:

答案 0 :(得分:2)

文档涉及寄存器

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

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

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

答案 1 :(得分: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

有一个迷你指南堆栈on the wiki ...