From da47dfdde6965d133c5b6f7c5fe72995a8410b77 Mon Sep 17 00:00:00 2001 From: german Date: Mon, 23 Mar 2026 21:29:25 +0400 Subject: [PATCH] Disassembly program --- .file_8814.tmp | Bin 0 -> 240 bytes OPTIONS.md | 8 +- dis.asm | 727 +++++++++++++++++++++++++++++++++++++++++++ ntsys | Bin 40824 -> 40952 bytes ntsys-disassembler.h | 84 +++++ ntsys.h | 19 +- 6 files changed, 833 insertions(+), 5 deletions(-) create mode 100644 .file_8814.tmp create mode 100644 dis.asm create mode 100644 ntsys-disassembler.h diff --git a/.file_8814.tmp b/.file_8814.tmp new file mode 100644 index 0000000000000000000000000000000000000000..66b312390b74b4d5d0e28bdd956ad4e5e25e45d1 GIT binary patch literal 240 zcmXw!Jqp4=5QX17wF%lpNF)lo_JX~4@B%hoC8V+wyg+I@5d$ea#H_WK@CMH2rc=`b-0q(H?ft(%`K)B{K-ar=D3=W*fv4Zo|n?AMCm$sqO#+!JAOFUYAhwH%` z00n674gis2BRxMGc8r;Dd{4l0pSl!k9ZDlvLa25l%UQS;`<7MVHt8z;0htFUjsO4v literal 0 HcmV?d00001 diff --git a/OPTIONS.md b/OPTIONS.md index e5a0346..18893e2 100644 --- a/OPTIONS.md +++ b/OPTIONS.md @@ -6,6 +6,7 @@ - ```--debug / -d - display debugging info``` - ```--mem / -m - asm output memory size``` - ```--nfull / -n - no print all debug info``` +- ```--unasm / -u - disassembly file``` ## Опция HELP Может быть вызвана как ```--help``` или ```-h```. Эта опция выводит краткую справку. @@ -14,7 +15,7 @@ Эта опция выводит версию программы. ## Опция ASM Может быть вызвана как ```--asm``` или ```-a```. -Эта опция переводит программу в режим компиляции ассемблера. +Эта опция переводит программу в режим ассемблера. ## Опция OUT Может быть вызвана как ```--out``` или ```-o```. Эта опция выводит скомпилированную ассемблерную программу в файл. @@ -27,4 +28,7 @@ Рекомендуется к использованию всегда. ## Опция NFULL Может быть вызвана как ```--nfull``` или ```-n```. -Эта опция выключаеть вывод аддресов и запрос выполнения в [режиме отладки](#опция-debug). \ No newline at end of file +Эта опция выключаеть вывод аддресов и запрос выполнения в [режиме отладки](#опция-debug). +## Опция UNASM +Может быть вызвана как ```--unasm``` или ```-u```. +Эта опция переводит программу в режим дизассемблере. \ No newline at end of file diff --git a/dis.asm b/dis.asm new file mode 100644 index 0000000..1d868b2 --- /dev/null +++ b/dis.asm @@ -0,0 +1,727 @@ +; 4D5AF1000800 +0x00000001: push +0x00000001: or +0x00000001: and +0x00000001: xor +0x00000001: jmp +0x00000001: bnez +0x00000001: bez +0x00000002: push.string +0x00000004: push +0x00000004: or +0x00000004: and +0x00000004: xor +0x00000004: jmp +0x00000004: bnez +0x00000004: bez +0x00000005: neq +0x00000006: push +0x00000006: or +0x00000006: and +0x00000006: xor +0x00000006: jmp +0x00000006: bnez +0x00000006: bez +0x00000007: push.string +0x00000008: push +0x00000008: or +0x00000008: and +0x00000008: xor +0x00000008: jmp +0x00000008: bnez +0x00000008: bez +0x00000009: push +0x00000009: or +0x00000009: and +0x00000009: xor +0x00000009: jmp +0x00000009: bnez +0x00000009: bez +0x0000000B: push.string +0x0000000D: push +0x0000000D: or +0x0000000D: and +0x0000000D: xor +0x0000000D: jmp +0x0000000D: bnez +0x0000000D: bez +0x0000000E: push.string +0x0000000F: pop +0x0000000F: syscall +0x0000000F: swap +0x0000000F: dup +0x0000000F: copy +0x0000000F: set +0x0000000F: mov +0x0000000F: call +0x00000010: push +0x00000010: or +0x00000010: and +0x00000010: xor +0x00000010: jmp +0x00000010: bnez +0x00000010: bez +0x00000011: push +0x00000011: or +0x00000011: and +0x00000011: xor +0x00000011: jmp +0x00000011: bnez +0x00000011: bez +0x00000012: pop +0x00000012: syscall +0x00000012: swap +0x00000012: dup +0x00000012: copy +0x00000012: set +0x00000012: mov +0x00000012: call +0x00000013: push.string +0x00000015: push.string +0x00000016: sub +0x00000017: push.string +0x00000019: push +0x00000019: or +0x00000019: and +0x00000019: xor +0x00000019: jmp +0x00000019: bnez +0x00000019: bez +0x0000001A: push.string +0x0000001B: push +0x0000001B: or +0x0000001B: and +0x0000001B: xor +0x0000001B: jmp +0x0000001B: bnez +0x0000001B: bez +0x0000001C: push +0x0000001C: or +0x0000001C: and +0x0000001C: xor +0x0000001C: jmp +0x0000001C: bnez +0x0000001C: bez +0x0000001E: push.string +0x00000020: push +0x00000020: or +0x00000020: and +0x00000020: xor +0x00000020: jmp +0x00000020: bnez +0x00000020: bez +0x00000021: push.string +0x00000022: mul +0x00000023: push +0x00000023: or +0x00000023: and +0x00000023: xor +0x00000023: jmp +0x00000023: bnez +0x00000023: bez +0x00000025: push +0x00000025: or +0x00000025: and +0x00000025: xor +0x00000025: jmp +0x00000025: bnez +0x00000025: bez +0x00000026: push.string +0x00000027: eq +0x00000028: push +0x00000028: or +0x00000028: and +0x00000028: xor +0x00000028: jmp +0x00000028: bnez +0x00000028: bez +0x0000002A: push +0x0000002A: or +0x0000002A: and +0x0000002A: xor +0x0000002A: jmp +0x0000002A: bnez +0x0000002A: bez +0x0000002B: push.string +0x0000002D: push +0x0000002D: or +0x0000002D: and +0x0000002D: xor +0x0000002D: jmp +0x0000002D: bnez +0x0000002D: bez +0x00000030: push.string +0x00000051: push +0x00000051: or +0x00000051: and +0x00000051: xor +0x00000051: jmp +0x00000051: bnez +0x00000051: bez +0x00000052: push +0x00000052: or +0x00000052: and +0x00000052: xor +0x00000052: jmp +0x00000052: bnez +0x00000052: bez +0x00000053: pop +0x00000053: syscall +0x00000053: swap +0x00000053: dup +0x00000053: copy +0x00000053: set +0x00000053: mov +0x00000053: call +0x00000054: push +0x00000054: or +0x00000054: and +0x00000054: xor +0x00000054: jmp +0x00000054: bnez +0x00000054: bez +0x00000056: push +0x00000056: or +0x00000056: and +0x00000056: xor +0x00000056: jmp +0x00000056: bnez +0x00000056: bez +0x00000057: push.string +0x00000058: push.string +0x00000059: push +0x00000059: or +0x00000059: and +0x00000059: xor +0x00000059: jmp +0x00000059: bnez +0x00000059: bez +0x0000005A: push +0x0000005A: or +0x0000005A: and +0x0000005A: xor +0x0000005A: jmp +0x0000005A: bnez +0x0000005A: bez +0x0000005B: push.string +0x0000005C: push +0x0000005C: or +0x0000005C: and +0x0000005C: xor +0x0000005C: jmp +0x0000005C: bnez +0x0000005C: bez +0x0000005D: push +0x0000005D: or +0x0000005D: and +0x0000005D: xor +0x0000005D: jmp +0x0000005D: bnez +0x0000005D: bez +0x0000005F: push.string +0x00000060: push +0x00000060: or +0x00000060: and +0x00000060: xor +0x00000060: jmp +0x00000060: bnez +0x00000060: bez +0x00000061: pop +0x00000061: syscall +0x00000061: swap +0x00000061: dup +0x00000061: copy +0x00000061: set +0x00000061: mov +0x00000061: call +0x00000062: pop +0x00000062: syscall +0x00000062: swap +0x00000062: dup +0x00000062: copy +0x00000062: set +0x00000062: mov +0x00000062: call +0x00000065: pop +0x00000065: syscall +0x00000065: swap +0x00000065: dup +0x00000065: copy +0x00000065: set +0x00000065: mov +0x00000065: call +0x00000066: push +0x00000066: or +0x00000066: and +0x00000066: xor +0x00000066: jmp +0x00000066: bnez +0x00000066: bez +0x00000067: push.string +0x00000068: push +0x00000068: or +0x00000068: and +0x00000068: xor +0x00000068: jmp +0x00000068: bnez +0x00000068: bez +0x00000069: push +0x00000069: or +0x00000069: and +0x00000069: xor +0x00000069: jmp +0x00000069: bnez +0x00000069: bez +0x0000006B: push.string +0x0000006D: pop +0x0000006D: syscall +0x0000006D: swap +0x0000006D: dup +0x0000006D: copy +0x0000006D: set +0x0000006D: mov +0x0000006D: call +0x0000006E: push +0x0000006E: or +0x0000006E: and +0x0000006E: xor +0x0000006E: jmp +0x0000006E: bnez +0x0000006E: bez +0x0000006F: push.string +0x00000070: push +0x00000070: or +0x00000070: and +0x00000070: xor +0x00000070: jmp +0x00000070: bnez +0x00000070: bez +0x00000071: push +0x00000071: or +0x00000071: and +0x00000071: xor +0x00000071: jmp +0x00000071: bnez +0x00000071: bez +0x00000073: push.string +0x00000074: push +0x00000074: or +0x00000074: and +0x00000074: xor +0x00000074: jmp +0x00000074: bnez +0x00000074: bez +0x00000075: push.string +0x00000076: pop +0x00000076: syscall +0x00000076: swap +0x00000076: dup +0x00000076: copy +0x00000076: set +0x00000076: mov +0x00000076: call +0x00000077: push +0x00000077: or +0x00000077: and +0x00000077: xor +0x00000077: jmp +0x00000077: bnez +0x00000077: bez +0x00000078: add +0x00000079: push.string +0x0000007A: push +0x0000007A: or +0x0000007A: and +0x0000007A: xor +0x0000007A: jmp +0x0000007A: bnez +0x0000007A: bez +0x0000007B: push.string +0x0000007C: push +0x0000007C: or +0x0000007C: and +0x0000007C: xor +0x0000007C: jmp +0x0000007C: bnez +0x0000007C: bez +0x0000007D: push +0x0000007D: or +0x0000007D: and +0x0000007D: xor +0x0000007D: jmp +0x0000007D: bnez +0x0000007D: bez +0x0000007F: push.string +0x00000080: push +0x00000080: or +0x00000080: and +0x00000080: xor +0x00000080: jmp +0x00000080: bnez +0x00000080: bez +0x00000081: pop +0x00000081: syscall +0x00000081: swap +0x00000081: dup +0x00000081: copy +0x00000081: set +0x00000081: mov +0x00000081: call +0x00000082: up +0x00000083: push +0x00000083: or +0x00000083: and +0x00000083: xor +0x00000083: jmp +0x00000083: bnez +0x00000083: bez +0x00000084: push.string +0x00000086: push +0x00000086: or +0x00000086: and +0x00000086: xor +0x00000086: jmp +0x00000086: bnez +0x00000086: bez +0x00000087: push +0x00000087: or +0x00000087: and +0x00000087: xor +0x00000087: jmp +0x00000087: bnez +0x00000087: bez +0x00000088: pop +0x00000088: syscall +0x00000088: swap +0x00000088: dup +0x00000088: copy +0x00000088: set +0x00000088: mov +0x00000088: call +0x00000089: push.string +0x0000008B: push.string +0x0000008C: setsp +0x0000008D: pop +0x0000008D: syscall +0x0000008D: swap +0x0000008D: dup +0x0000008D: copy +0x0000008D: set +0x0000008D: mov +0x0000008D: call +0x0000008E: push.string +0x0000009D: push +0x0000009D: or +0x0000009D: and +0x0000009D: xor +0x0000009D: jmp +0x0000009D: bnez +0x0000009D: bez +0x0000009E: push +0x0000009E: or +0x0000009E: and +0x0000009E: xor +0x0000009E: jmp +0x0000009E: bnez +0x0000009E: bez +0x0000009F: pop +0x0000009F: syscall +0x0000009F: swap +0x0000009F: dup +0x0000009F: copy +0x0000009F: set +0x0000009F: mov +0x0000009F: call +0x000000A0: push +0x000000A0: or +0x000000A0: and +0x000000A0: xor +0x000000A0: jmp +0x000000A0: bnez +0x000000A0: bez +0x000000A2: push +0x000000A2: or +0x000000A2: and +0x000000A2: xor +0x000000A2: jmp +0x000000A2: bnez +0x000000A2: bez +0x000000A3: push.string +0x000000A5: push +0x000000A5: or +0x000000A5: and +0x000000A5: xor +0x000000A5: jmp +0x000000A5: bnez +0x000000A5: bez +0x000000A7: push +0x000000A7: or +0x000000A7: and +0x000000A7: xor +0x000000A7: jmp +0x000000A7: bnez +0x000000A7: bez +0x000000A8: pop +0x000000A8: syscall +0x000000A8: swap +0x000000A8: dup +0x000000A8: copy +0x000000A8: set +0x000000A8: mov +0x000000A8: call +0x000000A9: push +0x000000A9: or +0x000000A9: and +0x000000A9: xor +0x000000A9: jmp +0x000000A9: bnez +0x000000A9: bez +0x000000AA: push +0x000000AA: or +0x000000AA: and +0x000000AA: xor +0x000000AA: jmp +0x000000AA: bnez +0x000000AA: bez +0x000000AB: push.string +0x000000AD: push +0x000000AD: or +0x000000AD: and +0x000000AD: xor +0x000000AD: jmp +0x000000AD: bnez +0x000000AD: bez +0x000000AE: push +0x000000AE: or +0x000000AE: and +0x000000AE: xor +0x000000AE: jmp +0x000000AE: bnez +0x000000AE: bez +0x000000AF: push.string +0x000000B0: push +0x000000B0: or +0x000000B0: and +0x000000B0: xor +0x000000B0: jmp +0x000000B0: bnez +0x000000B0: bez +0x000000B1: push +0x000000B1: or +0x000000B1: and +0x000000B1: xor +0x000000B1: jmp +0x000000B1: bnez +0x000000B1: bez +0x000000B3: push.string +0x000000B4: push +0x000000B4: or +0x000000B4: and +0x000000B4: xor +0x000000B4: jmp +0x000000B4: bnez +0x000000B4: bez +0x000000B5: push.string +0x000000B6: pop +0x000000B6: syscall +0x000000B6: swap +0x000000B6: dup +0x000000B6: copy +0x000000B6: set +0x000000B6: mov +0x000000B6: call +0x000000B7: push +0x000000B7: or +0x000000B7: and +0x000000B7: xor +0x000000B7: jmp +0x000000B7: bnez +0x000000B7: bez +0x000000B8: getsp +0x000000B9: push.string +0x000000BA: push +0x000000BA: or +0x000000BA: and +0x000000BA: xor +0x000000BA: jmp +0x000000BA: bnez +0x000000BA: bez +0x000000BB: push.string +0x000000BD: push +0x000000BD: or +0x000000BD: and +0x000000BD: xor +0x000000BD: jmp +0x000000BD: bnez +0x000000BD: bez +0x000000BE: push +0x000000BE: or +0x000000BE: and +0x000000BE: xor +0x000000BE: jmp +0x000000BE: bnez +0x000000BE: bez +0x000000BF: push.string +0x000000C0: push +0x000000C0: or +0x000000C0: and +0x000000C0: xor +0x000000C0: jmp +0x000000C0: bnez +0x000000C0: bez +0x000000C1: push +0x000000C1: or +0x000000C1: and +0x000000C1: xor +0x000000C1: jmp +0x000000C1: bnez +0x000000C1: bez +0x000000C3: push.string +0x000000C5: pop +0x000000C5: syscall +0x000000C5: swap +0x000000C5: dup +0x000000C5: copy +0x000000C5: set +0x000000C5: mov +0x000000C5: call +0x000000C6: push +0x000000C6: or +0x000000C6: and +0x000000C6: xor +0x000000C6: jmp +0x000000C6: bnez +0x000000C6: bez +0x000000C7: pop +0x000000C7: syscall +0x000000C7: swap +0x000000C7: dup +0x000000C7: copy +0x000000C7: set +0x000000C7: mov +0x000000C7: call +0x000000C8: up +0x000000C9: getsp +0x000000CA: pop +0x000000CA: syscall +0x000000CA: swap +0x000000CA: dup +0x000000CA: copy +0x000000CA: set +0x000000CA: mov +0x000000CA: call +0x000000CB: push +0x000000CB: or +0x000000CB: and +0x000000CB: xor +0x000000CB: jmp +0x000000CB: bnez +0x000000CB: bez +0x000000CC: push.string +0x000000CD: push +0x000000CD: or +0x000000CD: and +0x000000CD: xor +0x000000CD: jmp +0x000000CD: bnez +0x000000CD: bez +0x000000CE: push +0x000000CE: or +0x000000CE: and +0x000000CE: xor +0x000000CE: jmp +0x000000CE: bnez +0x000000CE: bez +0x000000D0: push.string +0x000000D2: pop +0x000000D2: syscall +0x000000D2: swap +0x000000D2: dup +0x000000D2: copy +0x000000D2: set +0x000000D2: mov +0x000000D2: call +0x000000D3: push +0x000000D3: or +0x000000D3: and +0x000000D3: xor +0x000000D3: jmp +0x000000D3: bnez +0x000000D3: bez +0x000000D4: push.string +0x000000D6: push +0x000000D6: or +0x000000D6: and +0x000000D6: xor +0x000000D6: jmp +0x000000D6: bnez +0x000000D6: bez +0x000000D8: push +0x000000D8: or +0x000000D8: and +0x000000D8: xor +0x000000D8: jmp +0x000000D8: bnez +0x000000D8: bez +0x000000D9: push.string +0x000000DB: push +0x000000DB: or +0x000000DB: and +0x000000DB: xor +0x000000DB: jmp +0x000000DB: bnez +0x000000DB: bez +0x000000DC: neq +0x000000DD: push +0x000000DD: or +0x000000DD: and +0x000000DD: xor +0x000000DD: jmp +0x000000DD: bnez +0x000000DD: bez +0x000000DE: pop +0x000000DE: syscall +0x000000DE: swap +0x000000DE: dup +0x000000DE: copy +0x000000DE: set +0x000000DE: mov +0x000000DE: call +0x000000DF: push +0x000000DF: or +0x000000DF: and +0x000000DF: xor +0x000000DF: jmp +0x000000DF: bnez +0x000000DF: bez +0x000000E1: push.string +0x000000E3: up +0x000000E4: push +0x000000E4: or +0x000000E4: and +0x000000E4: xor +0x000000E4: jmp +0x000000E4: bnez +0x000000E4: bez +0x000000E5: push +0x000000E5: or +0x000000E5: and +0x000000E5: xor +0x000000E5: jmp +0x000000E5: bnez +0x000000E5: bez +0x000000E6: pop +0x000000E6: syscall +0x000000E6: swap +0x000000E6: dup +0x000000E6: copy +0x000000E6: set +0x000000E6: mov +0x000000E6: call +0x000000E7: push +0x000000E7: or +0x000000E7: and +0x000000E7: xor +0x000000E7: jmp +0x000000E7: bnez +0x000000E7: bez diff --git a/ntsys b/ntsys index 4e214ffaac95d4947c55f340f4679ab358b2d2a2..6476a4609ce85b60e119ccb04603e734df3af06c 100755 GIT binary patch delta 14448 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 1) { + char is[3]; + strncpy(is, se, 2); + is[2] = '\0'; + if (is[0] != ':') { + __e_byte_t d = atoi(is); + if (d == c && f == 0 + && strcmp(name, "exit") + && strcmp(name, "rcall") + && strcmp(name, "global") + ) { + f = 1; + fprintf(out, "0x%08lX: %s \n", ftell(fp) - 8, name); + } + } + se += sizeof(char) * 2; + } + i ++; + } + } + fclose(fp); + fclose(out); + return EXIT_SUCCESS; +} + +#endif /* __LIB_mKOdwuwdww332_H_ */ diff --git a/ntsys.h b/ntsys.h index 470f77e..7dbb7be 100644 --- a/ntsys.h +++ b/ntsys.h @@ -28,6 +28,13 @@ #define NTSYS_VERSION "1.0" + +#if defined(__WIN32) || defined(__WIN64) +#define NTSYS_STANDARD_ASM_OUT "NUL" +#else +#define NTSYS_STANDARD_ASM_OUT "/dev/null" +#endif + #define NAME_OF_32_BITS_TYPE unsigned int #define NAME_OF_64_BITS_TYPE unsigned long int #define NAME_OF_16_BITS_TYPE unsigned short int @@ -68,6 +75,7 @@ void ntsys_error(char* _err) { word_t fGH6VSEzu7qNiGVE_mem_size = NTSYS_ASSEMBLE_STANDARD_MEMORY_SIZE; #include "ntsys-assembler.h" +#include "ntsys-disassembler.h" static void __help(void) { puts ( @@ -86,7 +94,8 @@ static void __help(void) { " " "--out / -o - set output file name" "\n" " " "--debug / -d - display debugging info" "\n" " " "--mem / -m - asm output memory size" "\n" - " " "--nfull / -n - no print all debug info" "\0" + " " "--nfull / -n - no print all debug info" "\n" + " " "--unasm / -u - disassembly file" "\0" ); } static int __exe_run(__e_byte_t* memory, __e_byte_t fulldebug, unsigned int memorysize, unsigned long filesize, FILE* fp, __e_byte_t debug) { @@ -210,7 +219,7 @@ int ntsys_api_call(char* filename, unsigned char debug, unsigned char isFullDebu int _lib_ntsys_main(int argc, char** argv) { unsigned int t = 1; char* filename = NULL; - char* asm_out = "out.exe"; + char* asm_out = NTSYS_STANDARD_ASM_OUT; char mode = 'R'; unsigned char out = 0; unsigned char debug = 0; @@ -240,12 +249,15 @@ int _lib_ntsys_main(int argc, char** argv) { break; case 'o': out = 1; - mode = 'A'; + if (mode != 'U') mode = 'A'; break; case 'm': mem = 1; mode = 'A'; break; + case 'u': + mode = 'U'; + break; default: ntsys_error("Unknown option!"); return EXIT_FAILURE; @@ -268,6 +280,7 @@ int _lib_ntsys_main(int argc, char** argv) { return EXIT_FAILURE; } if (mode == 'R') return ntsys_api_call(filename, debug, is_full_deb); + else if (mode == 'U') return ntsys_unassembly_file(filename, asm_out); return ntsys_compile_asm(filename, asm_out); }