0

NSISインストーラーを書くためにドキュメントを読んでいます。私はこれらの行に転落しました:

NSISがスクリプトに使用する命令は、PHPとアセンブリの間の一種のクロスです。実際の高級言語構造はありませんが、命令自体は(ほとんどの場合)高水準であり、便利な文字列機能を備えています(つまり、文字列の連結などについて心配する必要はありません)。基本的に、25個のレジスタ(20個の汎用、5個の特殊目的)とスタックがあります。

言語に25個のレジスタとスタックがあるとはどういう意味ですか?これらはデータ構造です。IMOこれらは、言語の構文や構造ではなく、メモリ管理に関連しています。これは言語構造/構文とどのように関連していますか?

ありがとう

4

2 に答える 2

2

ドキュメントはレジスタを参照しています

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

それらを変数と呼ぶこともできます。それらは既存の組み込みグローバル変数です。最初の 20 は一般的な使用変数で、最後の変数は nsis スクリプトで専用に使用されます。

スタックに関しては、実際にはインストーラー (またはアンインストーラー) の実行中に任意の値pushを ing およびing できますが、数値レジスターだけでなく文字列もプッシュできるため、ある意味高レベルのスタックです。また、Forth や HP 電卓の RPL 言語のように値を交換することで、スタックを操作できます。pop

于 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 に答える