aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorexegete <nikitf-97@mail.ru>2020-10-29 15:26:21 +0300
committerexegete <nikitf-97@mail.ru>2020-10-29 15:26:21 +0300
commit9392f52163b6629160fdb840c3e69126651df6cc (patch)
tree84d281a221d8f8722e390415de428b2fed687c3a
parent43ed5a384531400083a06dbb5929eafb621610bd (diff)
downloadcryptrobber-9392f52163b6629160fdb840c3e69126651df6cc.tar
cryptrobber-9392f52163b6629160fdb840c3e69126651df6cc.tar.xz
cryptrobber-9392f52163b6629160fdb840c3e69126651df6cc.zip
SML language overview added.
-rw-r--r--doc/sml_language.txt167
-rw-r--r--sts/ia32/math.sts8
2 files changed, 171 insertions, 4 deletions
diff --git a/doc/sml_language.txt b/doc/sml_language.txt
new file mode 100644
index 0000000..e7d804e
--- /dev/null
+++ b/doc/sml_language.txt
@@ -0,0 +1,167 @@
+-= Overview
+
+This document describes language used by cryptrobber and encrypt programs.
+Further this language will be referenced as SML (Stack Machine Language).
+"Strans" binary stack translator and "Smack" macroprocessor are used for
+translating SML program into ELF executable file. This document DOES NOT
+describe low level realisation of SML programs. For more information about
+methods envolved into this process you can refer to the "Threaded code" and
+"Call stack" topics.
+
+SML is a standard stack language. Every word (SML function) is executed in
+postfix notation. Even SML numbers are treated as words. For example:
+
+ 4 5 + sys_write
+
+"4", "5", "+", "sys_write" are SML words. First, executing "4" will push
+nubmer 4 into the stack. Executing "5" will push number 5 into stack.
+Executing "+" will pop two numbers from stack (4 and 5), summarize them
+and push the result into stack (9). Executing "sys_write" will pop number
+from the stack (9) and print it.
+
+Further text will describe all basic SML macros and words in details.
+" filename ", * macro *, / word / designations are used to distinguish
+between different entities.
+
+-= IA32 macros and words
+
+" macro.sts "
+
+* next *
+Finishes assembler word description.
+
+* defasm *
+Begins assembler word description.
+
+* defword *
+Begins standard SML word description.
+
+* defconst *
+Describes constant number SML word.
+
+* defarr *
+Describes number array SML word.
+
+* defvar *
+Describes number variable SML word.
+
+* as *
+Links the name with the top value from stack.
+
+* literal *
+Used for transparent translation of numbers. It is a part of
+"Smack" macroprocessor, so there is no need to call it expicitly.
+
+* set_entry *
+Defines ELF executable entry point.
+
+* if *, * fi *, * else *
+These macros are used to describe conditional block.
+
+* do *, * untilod *, * until *, * od *
+These macros are used to describe conditional loop block.
+
+" core.sts "
+
+/ docol /
+SML word interpreter. It is used by "defword" macro to include in every
+SML word header for it's execution.
+
+/ exit /
+Finishes SML word execution.
+
+/ lit /
+SML number interpreter. It is used by "literal" macro.
+
+" stack.sts "
+
+/ top /
+Pushes the address of top of stack.
+
+/ ref /
+Pops the number of chosen stack element and pushes the address
+of this element.
+
+/ get /
+Pops the number of chosen stack element and pushes its value.
+
+/ set /
+Pops the value and the number of chosen stack element and changes
+the value of this element.
+
+/ drop /
+Pops the top stack element.
+
+/ dup /
+Pushes the copy of the top stack element.
+
+/ over /
+Pushes the copy of stack element over the top stack element.
+
+/ swap /
+Swaps two top stack elements.
+
+" branch.sts "
+
+/ branch /
+Changes the execution flow to the chosen address.
+
+/ 0branch /
+Conditional branch. Changes the execution flow to the chosen address
+but only if the value of the top stack element is zero.
+
+" memory.sts "
+
+/ @ /
+Replaces the address on top of stack by its value in memory.
+
+/ ! /
+Pops the address and the value from stack. Assigns this value to memory
+referenced by the chosen address.
+
+" math.sts "
+
+/ + /
+Adds two numbers from stack and pushes the result.
+
+/ - /
+Subtracts two numbers from stack and pushes the result.
+
+/ mul /
+Multiplies two numbers from stack and pushes the result.
+
+/ div /
+Divides two numbers from stack and pushes the result.
+
+/ mod /
+Divides two numbers from stack and pushes the modulo.
+
+/ = /
+Compares two numbers from stack for equality and pushes the result.
+
+/ != /
+Compares two numbers from stack for inequality and pushes the result.
+
+/ < /
+Compares two numbers from stack. Pushes "1" if the first
+is less than the second.
+
+/ > /
+Compares two numbers from stack. Pushes "1" if the first
+is greater than the second.
+
+" bitwise.sts "
+
+/ xor /
+Pops two numbers, applies XOR operation to them and pushes the result.
+
+/ and /
+Pops two numbers, applies AND operation to them and pushes the result.
+
+/ shr /
+Pops the counter and the value. Shifts right the value with the counter and
+pushes the result.
+
+/ shl /
+Pops the counter and the value. Shifts left the value with the counter and
+pushes the result.
diff --git a/sts/ia32/math.sts b/sts/ia32/math.sts
index 609a21a..2997aeb 100644
--- a/sts/ia32/math.sts
+++ b/sts/ia32/math.sts
@@ -15,20 +15,20 @@ defasm mul
# 50 ?' ; push eax
next
-defasm mod
+defasm div
# 5b ?' ; pop ebx
# 58 ?' ; pop eax
# 31 ?' # d2 ?' ; xor edx, edx
# f7 ?' # f3 ?' ; div ebx
- # 52 ?' ; push edx
+ # 50 ?' ; push eax
next
-defasm div
+defasm mod
# 5b ?' ; pop ebx
# 58 ?' ; pop eax
# 31 ?' # d2 ?' ; xor edx, edx
# f7 ?' # f3 ?' ; div ebx
- # 50 ?' ; push eax
+ # 52 ?' ; push edx
next
defasm =